Struts2中防止表单重复提交的两种方式

Struts2防止表单重复提交 造成重复提交主要的两个原因: 1) 一是,服务器处理时间久。当用户在表单中填完信息,点击“提交”按钮后,由于服务器反应时间过长没能及时看到响应信息,或者出于其它目的,再次点击“提交”按钮,从而导致在服务器端接收到两条或多条相同的信息。如果信息需要存储到后台数据库中,如此以来就会产生数据库操作异常提示信息,以至于给用户带来错误信息提示,从而给用户的使用带来不便。 2) 二是,forward跳转引起的重复提交。当用户将信息提交到服务器,服务器响应采用forward方式调转到下一个页面后,此时地址栏中显示的是上个页面的URL,若刷新当前页面,浏览器会将再次提交用户先前输入的数据,就会再次出现表单重复提交的问题。当然你可以选择redirect方式跳转页面,这样就不会出现重复提交的问题;但有时为了达到某种效果或式。者出于网站安全的目的需要隐藏网页跳转,而不得不采用forward跳转方 立即下载

防止表单重复提交,这是个很重要的知识点,而且很有用。当用户提交了一个表单,此时,地址栏显示的是处理这个表单的Action的地址,若此时刷新,则会重新发送一次表单数据,即又进行了一次提交,若这个Action是用来处理用户注册的,那么重复提交会再一次向数据库中插入之前已经插入的数据,这显然不是我们想要的。有两种方法,可以防止表单重复提交,一种是用Action的重定向,一种是用Session Token(Session令牌)。

第一种方法,Action处理完用户提交的数据后,重定向到另一个Action或是一个页面,使用户提交后,所停留的位置,不是当前处理数据的Action,这样用户再刷新时,就不会再次执行这个Action了,就会避免表单重复提交的问题了。

第二种方法,是一种很经典的处理这个问题的机制。这种方法是在用户要提交的表单中,加入一个<s:token>标签,这样,当浏览器第一次访问这个带有<s:token>标签的页面时,在服务器中,解析<s:token>标签的类(TokenTag.class),会生成一个随机的字符串(这个字符串,查看网页的源代码可以看到),并且发送给客户端的浏览器,同时,在服务器中,会把这个随机字符串保存到用户的session对象中。当第一次提交表单时,在服务器中,会比较客户端和服务器中分别保存的这个随机字符串,因为是第一次提交,所以这两个字符串相等,然后进行正常的业务处理。第一次提交后,在服务器中的session中保存的这个随机字符串,会改变为其他的随机值,注意,这是很重要的一步!此时,地址栏停留在处理用户提交数据的Action中,客户端中保存的随机字符串没有改变,若是刷新页面,即重复提交,服务器再进行两个字符串的比较,会不相等,就会跳转到name为invalid.token的结果页面中,这样就会防止表单重复提交了。

第一种方法的举例,在上一篇博客中,这里就不再列出了,这里主要举例说明一下session token的机制:

Login.jsp:

<s:form action="/test/token" theme="simple">
    	username:<s:textfield name="username"></s:textfield><br>
    	password:<s:password name="password"></s:password><br>
    	<s:submit value="submit"></s:submit>
    	<s:token></s:token><!--一定要有这个标签-->
    </s:form>
struts.xml:

<action name="token" class="com.suo.actions.TokenAction">
	 		<result name="success">/WEB-INF/result/LoginResult.jsp</result>
	 		<result name="invalid.token">/WEB-INF/result/TokenFailed.jsp</result>
	 		<!-- 若重复提交,则会跳转到这个页面,注意这里result的名字,一定要是invalid.token -->
	 		
	 		<interceptor-ref name="token"></interceptor-ref>
	 		<interceptor-ref name="defaultStack"></interceptor-ref>
	 		<!-- 这里一定要有这两个拦截器 -->
	 	</action>
TokenAction.java:

package com.suo.actions;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class TokenAction extends ActionSupport {
	private String username;
	private String password;
	
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
	public String execute()
	{	
		return SUCCESS;
	}
}


结果页面就不写了


Struts2防止重复提交解决方案 立即下载

相关推荐

Codex CLI 接入智谱 GLM-5.1 完整教程

Codex CLI 是 OpenAI 推出的命令行 AI 编程工具,支持自主读取文件、执行命令、编写代码等操作,是目前最火的终端 AI 编程工具之一。通过 CLIProxyAPI 代理,我们成功将 Codex CLI 与智谱 GLM-5.1 模型对接,核心在于解决 Responses API 与 Chat Completions API 的协议转换问题。✅成熟稳定:CLIProxyAPI 社区活跃(4.7k fork),持续维护✅完整兼容:支持流式/非流式、function calling✅低成本。

u011831527的博客 2573

struts2之表单重复提交问题

  概述   表单的重复提交: 若刷新表单页面, 再提交表单不算重复提交.  在不刷新表单页面的前提下:  多次点击提交按钮 已经提交成功, 按 "回退" 之后, 再点击 "提交按钮". 在控制器响应页面的形式为转发情况下,若已经提交成功, 然后点击 "刷新(F5)“ 重复提交的缺点: 加重了服务器的负担 可能导致错误操作.      Struts2 解决表单重复提...

langdashu 246

Linux下科大讯飞离线语音识别SDK从下载到实战(附常见问题解决)

本文详细介绍了在Linux系统下,如何从科大讯飞开放平台获取离线语音识别SDK,完成环境准备、编译部署到实战开发的完整流程。文章重点解析了SDK目录结构、语法词典定制、示例代码修改,并针对开发中常见的“词典加载失败”、音频格式、交叉编译及性能优化等问题提供了深度解决方案,助力嵌入式与IoT开发者快速实现稳定可靠的离线命令识别功能。

honey的博客 1241

struts2防止表单重复提交(s:token)

说明 小例子 jsp页面 successjsp strutsxml UserAction类 运行结果 解决方法 方法1使用重定向 方法2使用stoken生成令牌配合token拦截器 jsp页面 strutsxml UserAction动作类 方法3使用stoken生成令牌配合tokensession拦截器说明防止表单的重复提交在我们的日常生活中有很大的重要性。 例如,如果在我们使用支付宝支付时,有

苏苏爱自由 1万+

数据分析(二):学生成绩预测分析报告

表1 特征变量描述变量描述school学生的学校sex学生的性别age学生的年龄address学生的家庭住址类型famsize家庭规模Pstatus父母同居状况Medu母亲的教育Fedu父亲的教育Mjob母亲的工作Fjob父亲的工作reason选择学校的理由guardian学生监护人traveltime从家到学校的时间studytime每周学习时间failures过去的类失败次数schoolsup额外的教育支持famsup家庭教育支持。

m0_73963149的博客 4415

TK抓包协议分析:So层逆向

第三个参数是一个回调函数,这里他的返回值1表示成功,0表示失败,那我们手动把他Hook为0,让他不支持quic协议,实现降级。等,我们是为了解决抓包问题,那很有可能是在net目录下(network),那来搜索一下。开了抓包以后APP直接是网络无连接了,并且抓到的请求也是不正常的,下面我们就开始定位。看了半天感觉也没啥有用的东西,那下面我们整理一下已经有信息,来猜测一下,后续怎么进行。那可以猜测,我们真正需要Hook的那个函数也有可能是这样加载的,可以字符串搜索一下。

2503_90751938的博客 3417

struts防止表单重复提交

情况描述:你已经提交过了,然后点击刷新。表单会重复提交,它会把你 的请求在一次发到action处理。一、用重定向方式(redirect),防止表单重复提交。 只需要在struts.xml 里配置成这样:``` 二、用令牌方式。 原理:Struts会自动在form里 写一个 hidden的属性的input name=”token” value=”令牌值” 。令牌值

vicoqi的博客 342

基于三轴加速度计的塑料水管泄漏振动检测技术全解析

在流体力学与结构动力学领域,管道振动分析是评估系统健康状态的关键技术。其基本原理在于,当管道内流体状态发生异常(如泄漏)时,会引发管壁产生特定的机械振动信号。这项技术的核心价值在于实现了对管道系统的非侵入式、在线监测,能够提前预警潜在故障,避免资源浪费与次生灾害。在智慧城市与智能水务等应用场景中,它对于保障供水管网安全、提升运维效率具有重要意义。本文聚焦于如何利用高精度的三轴加速度计,精准捕捉塑料水管因泄漏产生的微弱振动,并通过信号处理与机器学习算法,构建一套从数据采集到泄漏识别与定位的完整工程解决方案。

weixin_32239523的博客 407

Struts2_表单重复提交问题

表单重复提交 概述 表单的重复提交: --在不刷新表单页面的前提下:     多次点击提交按钮     已经提交成功,按“回退”之后,再点击“提交”按钮     在控制器响应页面的形式为转发情况下,若已经提交成功,然后点击“刷新(F5)" 注意: --若刷新表单页面,再提交表单不算重复提交 --若使用的是redirect的响应类型,已经提交成功后,再点击"刷新",不是表单的重

两岸猿_吴轻舟先生的博客 673

韩版传奇 2 源码分析与 Unity 重制(一)服务端 TCP 状态管理

该专题将会分析 LOMCN 基于韩版传奇 2,使用 .NET 重写的传奇源码(服务端 + 客户端),分析数据交互、状态管理和客户端渲染等技术,此外笔者还会分享将客户端部分移植到 Unity 和服务端用现代编程语言重写的全过程。本文重点介绍了服务端的启动链路、网络初始化和连接处理这三个过程,并简要分析的游戏循环的实现与数据包处理,在下一篇文章中,我们会从客户端角度分析从游戏启动、登录、游戏开始和基础游戏交互的全流程。

东方猫的博客 2497

RuntimeError: The current installed version of g++ (4.8.5) is less than the mininum version CUDA解决方案

本文主要介绍了RuntimeError: The current installed version of g++ (4.8.5) is less than the mininum version CUDA解决方案,希望能对学习python的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 8万+

Struts2实现避免表单重复提交

在平时的开发过程中,经常可以遇到表单重复提交的问题,如做一个注册页面,如果表单重复提交,那么一个用户就会注册多次。首先来看看引起表单重复提交的原因。 在页面跳转的时候,有两种类型,请求转发和重定向 所谓请求转发是在服务器端进行跳转,对用户是透明的,此时浏览器中的地址不会发生改变 重定向是在客户端发生跳转,跳转时候浏览器中的地址栏会发生改变 如果我们在注册时,使用了请求转发,那么当我们刷新页

Android学习之旅 1476

组建高效AI开发团队:角色、技能与协作

在当今科技飞速发展的时代,人工智能(AI)已经成为各个领域的核心驱动力。组建高效的AI开发团队对于企业和科研机构来说至关重要,它能够推动创新、提高竞争力、实现业务目标。本文的目的在于为那些希望组建或优化AI开发团队的管理者、技术负责人以及相关从业者提供全面的指导。范围涵盖了团队角色的定义、所需技能的分析、团队协作的策略,以及实际项目中的应用和相关资源的推荐。本文将首先介绍AI开发团队的核心概念与联系,包括团队角色、技能和协作之间的关系。接着阐述核心算法原理和具体操作步骤,结合数学模型和公式进行详细讲解。

2502_91592937的博客 995

Struts2中防止表单重复提交的两种方式及token拦截器的原理及作用

 当用户填写完表单后,在提交过一次后,若用户做如下操作比如再次点击提交、刷新页面、提交页面呈现后点击后退按钮,都会导致表单重复提交。如果信息需要存储到后台数据库中,重复提交就会再次向数据库中插入用户信息,显然这样是不对的。解决方式有两种第一种方法,Action处理完用户提交的数据后,重定向到另一个Action或是一个页面,使用户提交后,所停留的位置,不是当前处理数据的Action,这样用户再刷新时...

quliuwuyiz的博客 2083

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Session Token机制-Struts2中防止表单重复提交的两种方式(一)

当用户填写完表单后,在提交过一次后,若用户做如下操作比如再次点击提交、刷新页面、提交页面呈现后点击后退按钮,都会导致表单重复提交。如果信息需要存储到后台数据库中,重复提交就会再次向数据库中插入用户信息,显然这样是不对的。解决方式有两种 (一)Session Token机制    当用户首次访问包含表单的页面时,此时服务器会做三件事 1)创建一个session对象, 2)通过解析标签(编程时

沙漏 4086

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Action的重定向-Struts2中防止表单重复提交的两种方式(二)

在struts2中结果标签的的type属性不指定时的默认值是dispatcher,如果在注册时,使用了请求转发,那么当我们刷新页面时,就会引起表单的重复提交.而重定向则不会。

沙漏 2575

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

防止表达重复提交

防止表达重复提交 问题:什么是表单重复提交? 当在注册或者登陆遇到网络卡顿或者页面不能正常刷新时,我们大多数人都会进行对此的刷新操作; 如果不进行表单重复提交的处理会带来很大的危害 表单重复提交 危害: 刷票、 重复注册、带来服务器访问压力(拒绝服务) 解决方案: 在页面上生成一个令牌(就是一个随机字符串UUID),将其存储到session中,并在表单中携带. 在服务器端,获取数据时...

SYJ_1835_LPM的博客 290

struts2之防止表单重复提交

struts.xml配置文件 xml version="1.0" encoding="UTF-8" ?> DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">

m_yeah的专栏 685

struts2避免重复提交

 struts2使用拦截器来检查表单是否重复提交,它采用同步令牌的方式来实现对表单重复提交的判断。首先需要在表单中使用标签创建一个新的令牌值,并用你所指定的令牌名把令牌保存到session中。而这个令牌值是随即产生的经过加密的字符序列,不会重复。其次需要为action配置TokenInterceptor或者TokenSessionStoreInterceptor拦截器。这两个拦截器

草根的理想 517

J2EE系列之Struts2学习笔记(二十三)--Struts2防重复请求

我们在注册某个网站的时候,有的时候在网速响应比较慢的时候,可能会点击多次提交按钮,这样的话在第一次请求还没有处理完成的情况下,对于同一个请求我们请求了多次。 下面先看一个重复请求的例子: 1.新建工程:SecondLearnStruts2Chap09 2.新建一个类Student: package com.test.model; public class Student { priv

feidie436的专栏 394

表单重复提交

一、阻止表单重复提交 在表单提交页面写上                    在struts.xml配置文件中相应的action上配置拦截器 /filesShow.jsp 二、可以跳转的表单重复提交 struts.xml配置文件 "-//Apache Software Foundation//DTD Struts Configurat

sprita1的专栏 659

struts2防止表单重复提交

struts> 默认的视图主题 --> constant name="struts.ui.theme" value="simple" /> struts2在防止表单重复提交的拦截中有2个,分别是:token,tokenSession。tokenSession继承token而来。 通常情况下,使用tokenSession客户端感觉会比较友好。 --> 如果重复提交,会跳转

涂作权的博客 1224
上一篇: struts2中的参数传递
下一篇: Struts2 中拦截器和Action的调用关系
hackerain
博客等级 码龄16年 753粉丝 220原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值