在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>