在Struts2中,使用token的方式来防止二次提交。并且在默认的拦截器栈中提供了两个默认拦截器Token Interceptor和Token Session Interceptor。必须要在form中添加token标签,如果没有的话,则会被认为是invalid token。
Token Interceptor
这个拦截器在发现一个重复提交的无效的token的时候,会返回一个invalid.token,会在action的配置文件中匹配。
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>表单界面</title>
</head>
<body>
<s:actionerror/>
<s:form action="regist" method="post">
<s:token/>
<s:textfield name="name" label="名字" value="张三"/>
<s:textfield name="age" label="年龄" value="10"/>
<s:submit value="注册"/>
</s:form>
</body>
</html>
package com.fuwh.model;
import com.opensymphony.xwork2.ActionSupport;
public class Regist extends ActionSupport{
private static final long serialVersionUID = 1L;
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
System.out.println("添加学生:姓名:"+name+" 年龄:"+age);
Thread.sleep(5000);
return SUCCESS;
}
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<!-- 开启debug模式,会自动加载配置文件等等,不用每次更改了配置文件就去重新启动下服务器 -->
<constant name="struts.devMode" value="true" />
<!-- 配置action -->
<package name="regist" extends="struts-default">
<action name="regist" class="com.fuwh.model.Regist">
<interceptor-ref name="token"/>
<interceptor-ref name="defaultStack"/>
<result name="success">success.jsp</result>
<result name="invalid.token">index.jsp</result>
</action>
</package>
</struts>
Token Session Interceptor
这个拦截器会无视掉第一次提交的直至完成的所有二次提交,也不会返回什么invalid token
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<!-- 开启debug模式,会自动加载配置文件等等,不用每次更改了配置文件就去重新启动下服务器 -->
<constant name="struts.devMode" value="true" />
<!-- 配置action -->
<package name="regist" extends="struts-default">
<action name="regist" class="com.fuwh.model.Regist">
<interceptor-ref name="tokenSession"/>
<interceptor-ref name="defaultStack"/>
<result name="success">success.jsp</result>
<result name="invalid.token">index.jsp</result>
</action>
</package>
</struts>
原文:http://www.cnblogs.com/wangsicongde/p/7573531.html