Struts2防止表单重复提交

原创 2009年02月23日 09:24:00

最近开发中涉及到了表单重复提次的问题,通过研究做个总结。

防止表单重复提交主要用的到标签是<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就会不同。

 

以下为action代码

 

import com.opensymphony.xwork2.ActionSupport;

 

public class TestAction extends ActionSupport {   
    private static final long serialVersionUID = 6820659617470261780L;
   
    private String message;
       
    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
   
    @Override
    public String execute() {
        System.out.println("Executing action, your message is " + message);
        return SUCCESS;
    }   
}

 

再看看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>struts2 test token</title>
    <s:head />
</head>
<body>    
    <s:actionerror />
    <s:form action="testAction" >
        <s:textfield name="message" label="Message" />
        <s:token />   <%-- 注意这里--%>
        <s:submit />
    </s:form>
</body>
</html>

 

下面是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="test" extends="struts-default" namespace="/testToken">
       
<action name="test" class="com.fhx.TestAction">
           
  <result name="invalid.token">/input.jsp</result>                        
           
<result>/input.jsp</result>

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

       
</action>
    </package>
</struts>

 

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

Struts2中防止表单重复提交的两种方式

防止表单重复提交,这是个很重要的知识点,而且很有用。当用户提交了一个表单,此时,地址栏显示的是处理这个表单的Action的地址,若此时刷新,则会重新发送一次表单数据,即又进行了一次提交,若这个Acti...
  • hackerain
  • hackerain
  • 2011-11-19 00:54:41
  • 6558

Session Token机制-Struts2中防止表单重复提交的两种方式(一)

当用户填写完表单后,在提交过一次后,若用户做如下操作比如再次点击提交、刷新页面、提交页面呈现后点击后退按钮,都会导致表单重复提交。如果信息需要存储到后台数据库中,重复提交就会再次向数据库中插入用户信息...
  • snow_7
  • snow_7
  • 2016-05-24 20:32:11
  • 2440

struts2利用token防止表单重复提交(源代码)

  • 2014年02月24日 17:22
  • 4.66MB
  • 下载

Struts2 防止重复提交问题

相信都有表单提交的情况, 很多时候不希望出现重复提交原来的数据, 那么如何防止重复提交问题, 下面我是思考和一些参考整理的结果, 先看看其原理: 防止重复提交原理:  首先,在页面访问...
  • shenzhenNBA
  • shenzhenNBA
  • 2012-07-02 00:53:56
  • 9425

使用Struts的Token机制解决表单的重复提交

Struts的Token(令牌)机制能够很好的解决表单重复提交的问题,基本原理是:服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,看是否匹配。在处理完该请求...
  • update_java
  • update_java
  • 2015-09-23 15:08:55
  • 1130

Struts2如何防止表单重复提交

我们前边说道了Struts2的使用15个内建的验证器、自定义验证器和
  • qq792020962
  • qq792020962
  • 2017-07-11 15:01:03
  • 83

Struts2<s:token>防止表单重复提交

标签最近做项目,用到struts2,此处回顾一下表单提交。Struts2如何防止表单重复提交呢?关键就在于标签。标签转化成html时,添加了一个隐藏域,里面存储了当前提交的值,每次提交时的值不一样。...
  • qq_33938256
  • qq_33938256
  • 2016-03-28 21:52:05
  • 342

Action的重定向-Struts2中防止表单重复提交的两种方式(二)

在struts2中结果标签的的type属性不指定时的默认值是dispatcher,如果在注册时,使用了请求转发,那么当我们刷新页面时,就会引起表单的重复提交.而重定向则不会。...
  • snow_7
  • snow_7
  • 2016-05-25 09:39:37
  • 1647

Struts2中防止表单重复提交

完整版见https://jadyer.github.io/2011/02/07/struts2-token/
  • jadyer
  • jadyer
  • 2011-02-07 22:55:00
  • 2633

Asp.net实现弹出窗口提示,又防止刷新被重复提交的方法

Response.Write("alert(弹出窗口!);window.location=a.aspx;");    比如在1.aspx页面上点按钮,弹出来一个提示窗口,同时又希望按F5刷新的时候,不...
  • donetk
  • donetk
  • 2008-05-03 18:00:00
  • 239
收藏助手
不良信息举报
您举报文章:Struts2防止表单重复提交
举报原因:
原因补充:

(最多只允许输入30个字)