您的位置:首页 > 编程语言 > Java开发

struts2禁止表单重复提交

2013-11-24 12:06 477 查看
  token拦截器的使用

     a.在JSP表单中添加<s:token/>标签.

     b.在struts.xml的action配置中,添加token拦截器的引用

       <interceptor-ref name="token"/>

       token拦截器负责将表单中的ID与session中ID对比

     c.在struts.xml的action配置中,添加action中<result=invalid.token>视图.jsp</result>.

     如果拦截器发现重复提交,将自动调用此视图响应.

   tokenSession拦截器的使用

        a,b两步与token的使用相同.不需要c步骤

       tokenSession如果发现重复提交,将采用第一次提交的响应界面

 原理:如果是第一次进入表单会生成一个唯一ID session存着这个ID Hidden也存着id当提交给服务器

  服务器检查Session中的ID和hidden一致则提交成功同时会把session中的id清掉

 

配置struts.xml文件,声明动作

    <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"    "http://struts.apache.org/dtds/struts-2.0.dtd">

    <struts>

    <package name="avoidPackage" extends="struts-default">

    <action name="avoid" class="struts2.action.AvoidAction">

    <interceptor-ref name="token"></interceptor-ref>

    <interceptor-ref name="defaultStack"></interceptor-ref>

    <result name="invalid.token">/error.jsp</result>

    <result name="input">/input.jsp</result>

    <result name="success">/output.jsp</result>

    </action>

    </package>

    </struts>

    此时,需要在动作的声明中,为动作添加token拦截器,因为token拦截器不在defaultStack拦截器栈中,注意,需要将拦截器放在拦截器栈的第一位,这是因为判断表单是否被重复提交的逻辑应该在表单处理前。

例子:

    创建动作类

    public class AvoidAction extends ActionSupport {

    private static final long serialVersionUID = 2676453800249807631L;

    private String username;

    private Date birthday;

    public String getUsername() {

    return username;

    }

    public void setUsername(String username) {

    this.username = username;

    }

    public Date getBirthday() {

    return birthday;

    }

    public void setBirthday(Date birthday) {

    this.birthday = birthday;

    }

    @Override

    public String execute()

    {

    try {

    Thread.sleep(4000);

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    return SUCCESS;

    }

    }

    这个动作逻辑处理为挂起4秒钟,让我们有机会多次点击提交按钮,测试效果。

    创建页面:

    input.jsp

    <s:form action="avoid">

    <s:token>

    </s:token>

    <s:textfield name="username" label="Enter your name"></s:textfield>

    <s:textfield name="birthday" label="Enter your birthday"></s:textfield>

    <s:submit value="submit">

    </s:submit>

    </s:form>
 

测试:

在提交时按F5 或一直点击submit看到控制台出警告了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息