struts2中如何防止页面重复提交的问题,在这里我采用struts2自带的token令牌机制,废话补多少,直接上例子:
1.jsp页面。
<s:form action="register.action" method="post" >
<div>
<p>
<s:token></s:token>
<span>用户名:</span>
<span><input type="text" name="userName" /></span>
</p>
<p>
<span>密码:</span>
<span><input type="password" name="password" /></span>
</p>
<p>
<span><input type="submit" value="提交" /></span>
</p>
</div>
</s:form>
2.Register.java
<s:form action="register.action" method="post" >
<div>
<p>
<s:token></s:token>
<span>用户名:</span>
<span><input type="text" name="userName" /></span>
</p>
<p>
<span>密码:</span>
<span><input type="password" name="password" /></span>
</p>
<p>
<span><input type="submit" value="提交" /></span>
</p>
</div>
</s:form>
3.struts配置文件
1).使用Token
<action name="register" class="wsp.struts.action.RegisterAction">
<!-- 配置异常映射,当RegisterAction抛出Exception异常时,向用户显示error.jsp页面 -->
<exception-mapping result="error" exception="java.lang.Exception"/>
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="token"></interceptor-ref>
<!--如果重复提交也不跳转到error.jsp页面-->
<result name="invalid.token">error.jsp</result>
<result name="reginput">/error.jsp</result>
<result name="regsuccess">/success.jsp</result>
</action>
2).使用TokenSession
<action name="register" class="wsp.struts.action.RegisterAction">
<!-- 配置异常映射,当RegisterAction抛出Exception异常时,向用户显示error.jsp页面 -->
<exception-mapping result="error" exception="java.lang.Exception"/>
<interceptor-ref name="defaultStack" />
<interceptor-ref name="tokenSession" />
<!-- 如果重复提交,不会跳转到error.jsp页面 -->
<result name="invalid.token">error.jsp</result>
<result name="reginput">/error.jsp</result>
<result name="regsuccess">/success.jsp</result>
</action>
4.Token和TokenSession的比较
TokenSession的页面展示会更友好一些
5.Token实现控制表单重复提交的原理
当token拦截到用户的请求后,会判断在表单中生成的token的id也就是数字和英文组成 和保存在session(服务器端)的id是否相等如果相等就是地址提交。那么这个拦截器会将存放在session服务器端的session id值做一下变更 做变更后用户在点击刷新按钮,重复提交。拦截器会检查出来session id和用户提交的token id是不一样的,这个时候拦截器就会将这个请求发送到名字为invalid.token的视图,在这个试图上配置上页面就可以了。