先要配置攔截器,攔截器用於控制重複提交內容!其實原理很簡單,就是在表單內產生一個序列,判斷是否為新的序列,如果是之前的序列,則證明是一個重複提交內容!
| 代碼如下 |
複製代碼 |
<?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="common" extends="struts-default" namespace="/common"> <interceptors> <interceptor-stack name="loginStack"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="token"></interceptor-ref> </interceptor-stack> </interceptors> <default-interceptor-ref name="loginStack"></default-interceptor-ref> <action name="loginAction_*" class="loginAction" method="{1}"> <result name="success">/welcome.jsp</result> <result name="invalid.token" type="redirect">/index.jsp</result> <result name="input" type="redirect">/index.jsp</result> </action> </package> </struts> |
注意:
如果你不引用:
| 代碼如下 |
複製代碼 |
<interceptor-ref name="defaultStack"></interceptor-ref>那麼你的後台就不能再接收到參數。 <result name="invalid.token" type="redirect">/index.jsp</result> <result name="input" type="redirect">/index.jsp</result> |
這兩個返回你一定要配置!一個是重複提交的處理,一個是沒有表單標記時的處理!
JSP中增加Struts標籤的引用
| 代碼如下 |
複製代碼 |
<%@taglib prefix="s" uri="/struts-tags" %>在表單內增加一個標記: <s:form action="" name="form1" method="post"> <s:token></s:token> </s:form> |
頁面上會看到輸出兩個隱藏欄位:
| 代碼如下 |
複製代碼 |
<input type="hidden" name="struts.token.name" value="struts.token"/> <input type="hidden" name="struts.token" value="BXPNNDG6BB11ZXHPI4E106CZ5K7VNMHR"/> |
上面說了很多可能還有朋友不理解,下面我來舉個執行個體
struts.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> <!-- 預設的視圖主題 --> <constant name="struts.ui.theme" value="simple" /> <!-- struts2在防止表單重複提交的攔截中有2個,分別是:token,tokenSession。tokenSession繼承token而來。 通常情況下,使用tokenSession用戶端感覺會比較友好。 --> <!-- 如果重複提交,會跳轉到error.jsp頁面 --> <package name="person" namespace="/test" extends="struts-default"> <action name="token" class="com.ljq.action.PersonAction"> <interceptor-ref name="defaultStack" /> <interceptor-ref name="token" /> <!-- 如果重複提交,跳轉到error.jsp頁面 --> <result name="invalid.token">/WEB-INF/page/error.jsp</result> <result>/WEB-INF/page/message.jsp</result> </action> <action name="tokenSession" class="com.ljq.action.PersonAction"> <interceptor-ref name="defaultStack" /> <interceptor-ref name="tokenSession" /> <!-- 如果重複提交,不會跳轉到error.jsp頁面 --> <result name="invalid.token">/WEB-INF/page/error.jsp</result> <result>/WEB-INF/page/message.jsp</result> </action> </package> </struts> |
PersonAction類
| 代碼如下 |
複製代碼 |
package com.ljq.action;
import java.util.ArrayList; import java.util.List;
public class PersonAction { private String name; @SuppressWarnings("unchecked") //觀看控制台 //如果token生效則不會在控制台輸出name的值,而會輸出如下警告: 2011-3-14 20:45:32 com.opensymphony.xwork2.util.logging.commons.CommonsLogger //warn 警告: Form token EDZ4S96RNDN5VD8B1CQTK6FTHIJUPC66 does not match the session token null. public String execute() { List ls = new ArrayList(); ls.add(name); for (int i = 0; i < ls.size(); i++) { System.out.println(ls.get(i)); } return "success"; } public String getName() { return name; } public void setName(String name) { this.name = name; } } |
index.jsp表單頁面
| 代碼如下 |
複製代碼 |
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>防止表單重複提交</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> </head> <body> <!-- 防止表單重複提交,記得在form表單裡填上<s:token></s:token> --> <!-- action="token"、action="tokenSession" --> <s:form action="token" namespace="/test" method="post"> 姓名:<s:textfield name="name"/><s:token></s:token> <input type="submit" value="發送"/> </s:form> </body> </html>
|
message.jsp返回成功頁面
| 代碼如下 |
複製代碼 |
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> </head> <body> <s:property value="name"/><br/> <%=new Date() %> </body> </html> |