struts2_防止表单重复提交

来源:互联网 发布:python 连接informix 编辑:程序博客网 时间:2024/06/05 19:14

1. 什么是表单重复提交?
 表单重复提交是:假如用户的网速慢的时候,用户点击了提交按钮,却因为网速慢,而没有跳转到新的页面,这时的用户会再次点击提交按钮,举个例子:用户点击的是订单页面,当点击提交按钮的时候,也许因为网速的原因,没有跳转到新的页面,这时的用户会再次点击提交按钮,如果没有经过处理的话,这时用户就会生成两种订单了,很明显这是不符合规则的。

2. 表单重复提交的危害
 表单重复提交带来很多危害或者是隐患,比如:刷票、 重复注册、攻击服务器、带来服务器访问压力(拒绝服务)等等。

3. 解决表单重复提交的思路?
 在页面上生成一个令牌(其实就是随机字符串),将其存储到session中,并在表单中携带。在服务器端,获取数据时,也将令牌获取,将它与session中的令牌进行对比,没问题的话,就将session中的令牌删除。

4. struts2如何解决表单重复提交
 在struts2中解决表单重复提交,可以使用它定义的一个interceptor(拦截器)。
<interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/>

步骤:1.在页面上需要使用一个token tag在表单中添加一个标签  <s:token/>就会在页面上生成一个令牌,并存在于表单中。2.需要在action中引入token拦截器    <interceptor-ref name="token"/>3.需要配置视图    <result name="invalid.token">/token.jsp</result>当表单重复提交时,token拦截器自动跳转result name="invalid.token"通过 <s:actionError/> 显示错误信息 覆盖重复提交信息  struts.messages.invalid.token=您已经重复提交表单,请刷新后重试============================实例===============================JSP页面上:<form action="${pageContext.request.contextPath}/regist.action"        method="get">        <s:token/>        username:<input type="text" name="username"><br>        password:<input type="password" name="password"><br> <input            type="submit" value="注册"></form>struts.xml中的配置:<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"    "http://struts.apache.org/dtds/struts-2.3.dtd"><struts>    <package name="default" namespace="/" extends="struts-default">        <action name="regist" class="cn.itcast.action.RegistAction">            <result name="invalid.token">/token.jsp</result>            <interceptor-ref name="token" />            <interceptor-ref name="defaultStack" />        </action>    </package></struts>
原创粉丝点击