好記性不如賴筆頭……
表單重複提交的問題可能大多數開發者都會遇到,在未使用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>
配置完成,啓動項目,訪問結果如下:
提交後,頁面提示的內容如下:
後臺輸出內容如下:
刷新重複提交 後,顯示頁面包括後臺輸出無任何變化,說明防止重複提交成功。