原因
一、重复提交 ,应该想到两种场景:
1. 在下单,或者支付 这种情况 那么不允许 刷新,不允许后退再点击提交(后退之后提交会失败,修改了也不行)。
2. 在填写表单之后,提交完成之后,不允许 刷新,但是允许 返回之后 提交,给用户修改表单的机会。
二、工作原理
在服务器端生成一个唯一的随机标识号,专业术语称为Token(令牌),同时在当前用户的Session域中保存这个Token。
- 将Token发送到客户端的Form表单中,在Form表单中使用隐藏域来存储这个Token,表单提交的时候连同这个Token一起提交到服务器端。
- 在服务器端判断客户端提交上来的Token与服务器端生成的Token是否一致,如果不一致,那就是重复提交了,此时服务器端就可以不处理重复提交的表单。如果相同则处理表单提交,处理完后清除当前用户的Session域中存储的标识号。
(空了就不匹配了)
1、开发步骤
(1)jsp页面写上<%@ taglib uri="/struts-tags" prefix="s" %><s:token />//要在form范围中
(2)struts.xml配置
<action name="user" class="com.struts2.action.UserAction">
<!-- 令牌拦截器1 -->
<!--启用默认拦截器 ,开发令牌的第2步 -->
<interceptor-ref name="defaultStack" />
<!--启用自定义拦截器 ,开发令牌的第3步 -->
<interceptor-ref name="token">
<!-- 只拦截add方法 -->
<param name="includeMethods">add</param>
<!--只对add方法拦截
excludeMethods表示排除指定的方法,即不对标记为excludeMethods的方法进行拦截,
includeMethods表示包含指定的方法,即对标记为includeMethods的方法进行拦截,
-->
</interceptor-ref>
<!-- 拦截后显示的页面不能在web-info下,不需要则不设置(token.jsp或) -->
<result name="invalid.token" type="redirect">/user/user!list.action<result>
<!--避免重复-->
.....result....</action>
网友评论