好记性不如赖笔头……
表单重复提交的问题可能大多数开发者都会遇到,在未使用Struts2框架之前的解决方案是在进入提交表单页面,将验证码保存在session中,当表单提交时,就会验证 验证码是否存在,如果存在,则删除,通过 验证,如果不存在,则提示重复提交或超时。
Struts2中提供了防止表单提效的拦截器token/tokenSession,他们的作用分别是:
1. token拦截器:如果重复提交会直接返回“No result defined for action com.ckinghan.web.action.RegAction and result invalid.token”提示,须要自己定义”invalid.token”的返回视图。
2. tokenSession拦截器:对于重复提交的表单请求忽略,不做任何处理。
注意,它们使用的前提是,在JSP页面,须要使用s:token标签。
示例如下:
1、创建reSubmit.jsp页面,具体代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>重复提交表单测试</title>
</head>
<body>
<hr>
<h1>用户注册</h1>
<s:form action="reg">
<s:token></s:token>
<s:textfield name="userName" label="昵称"/>
<s:password name="password" label="密码"/>
<s:submit value="注册"></s:submit>
</s:form>
</body>
</html>
2、创建RegAction动作类,并继承ActionSupport,具体代码如下:
package com.ckinghan.web.action;
import com.opensymphony.xwork2.ActionSupport;
public class RegAction extends ActionSupport {
private String userName;
private String password;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String reg(){
System.out.println(userName);
System.out.println(password);
return SUCCESS;
}
}
3、创建Struts.xml文件,存储在src目录下,具体配置如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.devMode" value="true"/>
<package name="formReSumbit" extends="struts-default">
<action name="reg" class="com.ckinghan.web.action.RegAction" method="reg">
<!-- 先执行默认拦截器(如果在这里配置了非默认拦截器,默认拦截器将不在执行,所以在这里将默认拦截器也配置上) -->
<interceptor-ref name="defaultStack"/>
<!-- tokenSession拦截器,对于重复提交的表单不做任何处理 -->
<interceptor-ref name="tokenSession"/>
<!-- token拦截器与tokenSession拦截器使用一个就可以了,使用了token拦截器,必须配合“invalid.token”的返回视图 -->
<!-- <interceptor-ref name="session"/> -->
<result>/success.jsp</result>
<!-- 配合token拦截器使用 -->
<!-- <result name="invalid.token">/error.jsp</result> -->
</action>
</package>
</struts>
4、error.jsp文件的内容如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>错误提示</title>
</head>
<body>
请勿重复提交
</body>
</html>
配置完成,启动项目,访问结果如下:
提交后,页面提示的内容如下:
后台输出内容如下:
刷新重复提交 后,显示页面包括后台输出无任何变化,说明防止重复提交成功。