天天看点

Struts 2.x避免表单的重复提交——Token

 (1)       避免表单的重复提交的方式:

Ø  采用HttpServletRequest.sendRedirect()方法将客户端重定向到成功页面。

Ø  在客户端通过JavaScript实现;

Ø  在服务端编写代码实现。

(2)       在服务器端避免表单重复提交,通常是采用<b>同步令牌</b>的方式来实现,其基本的原理如下:

(1)用户访问包含表单的页面,服务器端在这次会话中,创建一个Session对象,并产生一个令牌值,将这个令牌值作为隐藏输入域(&lt;input&gt;元素的type属性为hidden)的值, 随表单一起发送到客户端,同时将令牌值保存到Session中。

(2)用户提交页面,服务器端首先判断请求参数中的令牌值和Session中保存的令牌值是否相等,如果相等,则淸除Session中的令牌值,然后执行数据处理操作。如果不相等,则提示用户己经提交过了表单,同时产生一个新的令牌值,保存到Session中。当用户重新访问提交数据页面时,将新产生的令牌值作为隐藏输入域的值。

(3)       Struts 2的实现方式:

(1)需要在表单中使用&lt;s:token&gt;标签,并置定一个令牌的名称。例如:&lt;s:token name=”user.token” /&gt;

(2)为Action类配置应用TokenInterceptor或者TokenSessionStoreInterceptor拦截器,这两个拦截器已经在struts-default.xml中定义,但没有包含在default拦截器栈中.

TokenAction.java:

import com.opensymphony.xwork2.ActionSupport; 

import com.opensymphony.xwork2.ModelDriven; 

public class TokenAction extends ActionSupport implements ModelDriven&lt;User&gt; { 

    private static final long serialVersionUID = 7502909137522615270L; 

    private User user=new User(); 

    @Override 

    public User getModel() { 

        return user; 

    } 

    public String execute() throws Exception { 

        if ("qiang".equalsIgnoreCase(user.getName())&amp;&amp;"1234".equals(user.getPassword())) { 

            return SUCCESS; 

        } else { 

            return ERROR; 

        } 

User.java:

public class User { 

    private String name; 

    private String password; 

    //省略getter与setter方法 

token_login.jsp:

&lt;body&gt; 

    &lt;s:form action="token"&gt; 

        &lt;s:textfield name="name" label="姓名"&gt;&lt;/s:textfield&gt;&lt;br&gt; 

        &lt;s:password name="password" label="密码"&gt;&lt;/s:password&gt;&lt;br&gt; 

        &lt;s:token&gt;&lt;/s:token&gt;&lt;br&gt; 

        &lt;s:submit value="提交"&gt;&lt;/s:submit&gt;&lt;br&gt; 

    &lt;/s:form&gt; 

  &lt;/body&gt; 

struts.xml

&lt;package name="token" extends="struts-default"&gt; 

        &lt;action name="token" class="com.mzsx.token.TokenAction"&gt; 

            &lt;result name="success"&gt;/s15/success.jsp&lt;/result&gt; 

            &lt;result name="invalid.token"&gt;/s15/error.jsp&lt;/result&gt; 

            &lt;interceptor-ref name="token"&gt;&lt;/interceptor-ref&gt; 

            &lt;interceptor-ref name="defaultStack"&gt;&lt;/interceptor-ref&gt; 

        &lt;/action&gt; 

    &lt;/package&gt; 

本文转自 梦朝思夕 51CTO博客,原文链接:http://blog.51cto.com/qiangmzsx/1135799