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的视图,在这个试图上配置上页面就可以了。