Lotus教程、Java教程、Java虚拟机、Java软件综合开发社区

Lotus、Domino、Java、C#、Web、数据库综合开发教程、资料社区

Struts2中如何防止表单刷新重复提交



Published by admin on 08月 18, 2008

做web开发时.经常会出现系统缓慢导致用户多次重复提交.或被恶意重复提交.有很多解决办法:比如:点了提交按扭后就让按扭disable=flase或其他相关处理.但struts2中处理起来更方便.

主要是需要做以下几个步骤:

1、jsp中增加 <s: token />;

2、struts2配置文件中.action中增加几行代码:

<interceptor-ref name=”defaultStack” />
<interceptor-ref name=”token” />
<result name=”invalid.token” type=”redirect>/token.jsp</result>     //如果是重复提交则跳转至token.jsp页面

另外注意点的是:在提交成功后的<result name=”success” type=”redirect”>…</result> 也设置type=redirect

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

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

清单6 <s:token />的HTML输出同时,将GUID放到会话(session)中;在执行action之前,“token”拦截器将会话token与请求token比较,如果两者相同,则将会话中的token删除并往下执行,否则向actionErrors加入错误信息。如此一来,如果用户通过某种手段提交了两次相同的请求,两个token就会不同。

具体实现

首先看一下Action的代码:

package tutorial;

import com.opensymphony.xwork2.ActionSupport;

public class CoolTagAction 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;
   }
   
}

清单7 src/tutorial/CoolTagAction.java以上代码一目了然,再看看JSP的写法:

JSP也很简单,就是加入<s:token />标志。

%@ 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 2 Cool Tags - <s:token/ ></title>
   
<s:head />
</head>
<body>    
   
<h2>struts2防重复提交<s:token/></h2>
   
<s:actionerror />
   
<s:form action=”Token” >
       
<s:textfield name=”message” label=”Message” />
       
<s:token />
       
<s:submit />
   
</s:form>
</body>
</html>
清单8 WebContent/token.jsp接下来是Actoin配置的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=”Struts2_COOL_TAGS_DEMO” extends=”struts-default”>
       
<action name=”Token” class=”tutorial.CoolTagAction”>
           
<interceptor-ref name=”defaultStack” />
           
<interceptor-ref name=”token” />
           
<result name=”invalid.token”>/token.jsp</result>                        
           
<result>/token.jsp</result>
       
</action>
       
<action name=”*”>
           
<result>/{1}.jsp</result>
       
</action>
   
</package>
</struts>
清单9 src/struts.xml以上XML片段值注意的是加入了“token”拦截器和“invalid.token”结果,因为“token”拦截器在会话token与请求token不一致时,将会直接返回“invalid.token”结果。

发布运行应用程序,在浏览器中键入:http://localhost:8080/Struts2_CoolTags/token.jsp,出现如下图所示页面:

正常显示的token.jsp页面
清单10 正常显示的token.jsp页面

随便填点东西并提交页面,一切正常返回以上页面,然后按“F5”刷新页面,在弹出的对话框中点击“Retry”,出现如下图所示页面:

重复提交出错显示
清单11 重复提交出错显示



【版权说明】:本网页上有部分内容来源于网上收集,但不能保证资料的完整性和准确性,仅提供参考和学习。如有侵权请立即通知我们,我们将立即删除,谢谢合作!

Add A Comment