Struts2防止表单重复提交

Struts2防止表单重复提交

2009年04月14日 星期二 11:37

    在开发的时候,很多时候会需要防止用户重复提交表单。在 Strut2 中可以方便的实现这个功能。

     

    防止表单重复提交主要用到的标签是<s: token />,拦截器 < interceptor-ref name ="token" />, 还有一个默认的返回值 < result name ="invalid.token"> /input.jsp </ result >   

     

    在页面加载时,<s: token />产生一个GUID(Globally Unique Identifier,全局唯一标识符)值的隐藏输入框如:

     

    < input type ="hidden" name ="struts.token.name" value ="struts.token"/>

    < input type ="hidden" name ="struts.token" value ="BXPNNDG6BB11ZXHPI4E106CZ5K7VNMHR"/>

     

    同时,将GUID放到会话(session)中;在执行action之前,“token”拦截器将会话token与请求token比较,如果两者相同,则将会话中的token删除并往下执行,否则向actionErrors加入错误信息。如此一来,如果用户通过某种手段提交了两次相同的请求,两个token就会不同。注意:产生的 html 代码中, struts.token.name 是永远不变的,而 struts.token 是可以改变的(通过在 jsp 中引入标签 <s:token name=" 你想取的名字 "/> ,这里的 name 属性就会取代掉 struts.token ),另外,两个 struts.token 是关联在一起的。

     

    举个例子:

     

    以下为action代码

     

    package com.polaris.token;

     

    import com.opensymphony.xwork2.ActionSupport;

     

    public class TokenAction extends ActionSupport

    {

    private static final long serialVersionUID = 1L;

    private String message;

     

    public String getMessage()

    {

    return message;

    }

     

    public void setMessage(String message)

    {

    this.message = message;

    }

     

    @Override

    public String execute() throws Exception

    {

    System.out.println("执行Action, 输出内容:" + getMessage());

    return SUCCESS;

    }

    }

    清单 1 TokenAction 代码

     

    再看看JSP的写法

     

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>

    <%@ taglib prefix="s" uri="/struts-tags" %>

     

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ">

    <html xmlns=" http://www.w3.org/1999/xhtml ">

     

    <head>

        <title>struts token</title>

        <s:head />

    </head>

    <body>    

        <s:actionerror />

        <s:form action=" token " >

            <s:textfield name="message" label="Message" />

            <s:token />    <%-- 注意这里,记得放在 form 表单内,可以自己给 token 命名--%>

            <s:submit />

        </s:form>

    </body>

    </html>

    清单 2 message.jsp

     

    下面是struts2的配置文件

    <? 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 =" struts2 " extends ="struts-default">

    < action name =" token " class ="com.polaris.token.TokenAction">

                 < result name ="invalid.token"> / message .jsp </ result > <!--注意此处-->

    < result > / message .jsp </ result >

               < interceptor-ref name ="defaultStack" />

                < interceptor-ref name ="token" / >

            </ action >

        </ package >

    </ struts >

    清单 3 struts.xml

     

    以上XML片段值注意的是加入了“token”拦截器和“invalid.token”结果,因为“token”拦截器在会话token与请求token不一致时,将会直接返回“invalid.token”结果。

     

    启动服务器,在浏览器地址栏输入: http://localhost:8080/struts2/message.jsp (根据你配置的 Tomcat 不同,地址有所不同)出现图 1 所示内容

     

     

    1 :没有提交时

     

    第一次提交后,如图 2

     

    2 :第一次提交后没有错误信息

     

    接着点击刷新按钮,确定后出现如图 3 所以内容

     

     

    3 :刷新页面后(即重复提交)

     

    上面的错误提示信息是 Struts2 给我们定义好的(在 struts2-core.jar 内的 org.apache.struts2 包下有一个 struts-message.properties 资源文件。里面定义了一些可配置常量 , 其中就有 struts.messages.invalid.token

    具体配置如下:

     

  1. 在src文件夹中加入struts.properties文件,内容如下:

     

    struts.custom.i18n.resources= testToken

     

      Struts 2.0有两个配置文件,struts.xml和struts.properties都是放在WEB-INF/classes/下。

    1. struts.xml用于应用程序相关的配置
    2. struts.properties用于Struts 2.0的 运行时(Runtime)的配置

     

  2. 在src文件夹中加入 testToken_zh_CN.properties 文件,内容如下:

    struts.messages.invalid.token = 你已经提交了,不能再提交!

     

    在此只实现了中文显示(对多语言可以配置相应的内容)

     

    重启服务器后,重复上面的执行操作。出现如图 4 所示内容:

     

    4 :出现了刚才定义的中文信息提示

     

你可能感兴趣的:(apache,xml,jsp,应用服务器,struts)