Struts中防止表单重复提交

先了解下为什么会有重复提交问题:

重复提交说白了就是重复操作了相同的记录,导致内存中有多条相同的记录的情况。

  1、 在表单提交到一个action,而action又通过请求转发dispatcher(forward)的方式响应了一个JSP(HTML)页面,            此时地址栏还保留着action的那个路径,在响应页面点击“刷新”,这就是一个重复提交的情况。

2、在响应页面没有到达时,重复点击提交按钮。即我们所说的网络阻塞情况下。

3、点击返回,再点击提交。例如:登陆成功后,后退后再登陆。

处理表单重复提交有2中方法:客户端处理和服务端处理:

客户端处理:(用js定义一个全局的变量来控制表单不提交)

定义一个js:

<script language="javascript"> 
    var checkSubmitFlg = false; 
    function checkSubmit() { 
      if (checkSubmitFlg == true) { 
         return false; 
      } 
      checkSubmitFlg = true; 
      return true; 
   } 
</script>
总结:处理表单重复提交的方法
<s:form name="userForm" method="post" action="user/add_user" onSubmit="return checkSubmit();">

服务端处理(令牌机制)

介绍下struts2提供了一种Session级别的令牌机制Token

原理:

1.在regist.jsp页面使用<s: token />中生成一个唯一随机值,当用户访问此表单的网页时,就将其保存到Session中, 同时将其保存为表单的隐藏域的值.
2.在处理注册的请求时,获取Session中值,获取请求参数的值,比较两者是否相同, 如果相同说明不是重复提交,请求通过同时删除session中保存的值, 如果不相同则是重复提交, 不能通过.

这里我就介绍下用token来防止:

<div style="color: rgb(51, 51, 51); text-align: left;"><span style="font-family: 'Microsoft Yahei', 微软雅黑, arial, 宋体, sans-serif;">					<s:form name="loginForm" method="post" action="login"</span></div><div style="color: rgb(51, 51, 51); text-align: left;">						theme="simple"></div><span style="color:#333333;">						<tr>
</span><div style="color: rgb(51, 51, 51); text-align: left;"><span style="font-family: 'Microsoft Yahei', 微软雅黑, arial, 宋体, sans-serif;">							<td width="30" height="31"><input name="user.userName"</span></div><span style="color:#333333;">							<td width="70" height="31" align="center">用户名:</td>
</span><div style="color: rgb(51, 51, 51); text-align: left;"><span style="font-family: 'Microsoft Yahei', 微软雅黑, arial, 宋体, sans-serif;">							<td width="20" height="31" align="right"><s:fielderror</span></div><span style="color:#333333;">								type="text" class="input"></td>
									fieldName="userName"></s:fielderror></td>
</span><div style="color: rgb(51, 51, 51); text-align: left;"><span style="font-family: 'Microsoft Yahei', 微软雅黑, arial, 宋体, sans-serif;">							<td width="30" height="29"><input name="user.passWord"</span></div><span style="color:#333333;">						</tr>
						<tr>
							<td width="70" height="29" align="center">密  码:</td>
</span><div style="color: rgb(51, 51, 51); text-align: left;"><span style="font-family: 'Microsoft Yahei', 微软雅黑, arial, 宋体, sans-serif;">							<td width="20" height="31" align="right"><s:fielderror</span></div><span style="color:#333333;">								type="password" class="input">
							</td>
									fieldName="password"></s:fielderror></td>
						</tr>
</span><div style="color: rgb(51, 51, 51); text-align: left;"><span style="font-family: 'Microsoft Yahei', 微软雅黑, arial, 宋体, sans-serif;">								type="submit" name="Submit" value="登陆" class="button"></span></div><span style="color:#333333;">						<tr>
							<td height="30" colspan="2" align="center"><input
								  <input type="reset" name="Submit2" value="重置"
</span><div style="text-align: left;"><span style="font-family: 'Microsoft Yahei', 微软雅黑, arial, 宋体, sans-serif;"><span style="color:#333333;">						</span><span style="color:#ff0000;"><s:token /></span></span></div><span style="color:#333333;">								class="button">
							</td>
</span><div style="color: rgb(51, 51, 51); text-align: left;"><span style="font-family: 'Microsoft Yahei', 微软雅黑, arial, 宋体, sans-serif;">						</tr></span></div>

然后再struts.xml中配置一个拦截器:
<span style="white-space:pre">		</span><interceptors>
			<interceptor-stack name="tokenStack">
				<interceptor-ref name="token" />
				<interceptor-ref name="defaultStack" />
			</interceptor-stack>
		</interceptors>
在需要拦截的action中配置该拦截器:
<span style="color: rgb(51, 51, 51); white-space: pre;">		</span><span style="color:#333333;"><action name="login" class="loginAction" method="login">
			<interceptor-ref name="tokenStack"></interceptor-ref>
			</span><span style="color:#ff0000;"><result name="invalid.token">/WEB-INF/error/error.jsp</result></span><span style="color:#333333;">
			<!-- 这里用redirect防止在刷新时造成重复提交表单的问题 -->
			<result name="login_success" type="redirectAction">empty/manage_empty</result>
			<result name="input" type="redirect">/index.jsp</result>
		</action></span>

ps:

以前说重定向可以解决表单重复提交的问题,但这只能防止用户点击刷新按钮,如果用redirect,url会改变,也就没有重复提交的问题,但是当我点击浏览器中的返回,然后再点击提交,如此反复,仍然在重复调用action,这也是重复提交,这时就要用token防止了。

总结:如果使用客户端处理,则重复提交不上去,页面也不会跳转。

如果用服务端处理,需要定义一个重复提交的页面,这样做的好处是可以自己处理重复提交的业务逻辑。

总之,仁者见仁智者见智……




总结:处理表单重复提交的方法
深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值