一.攔截器簡要概述html
攔截器,在AOP(Aspect-Oriented Programming)中用於在某個方法或字段被訪問以前,進行攔截而後在以前或以後加入某些操做。攔截是AOP的一種實現策略。java
二.系統默認攔截器web
功能說明:apache
攔截器cookie |
名字session |
說明app |
Alias Interceptorjsp |
aliaside |
在不一樣請求之間將請求參數在不一樣名字件轉換,請求內容不變post |
Chaining Interceptor |
chain |
讓前一個Action的屬性能夠被後一個Action訪問,如今和chain類型的result(<result type=」chain」>)結合使用。 |
Checkbox Interceptor |
checkbox |
添加了checkbox自動處理代碼,將沒有選中的checkbox的內容設定爲false,而html默認狀況下不提交沒有選中的checkbox。 |
Cookies Interceptor |
cookies |
使用配置的name,value來是指cookies |
Conversion Error Interceptor |
conversionError |
將錯誤從ActionContext中添加到Action的屬性字段中。 |
Create Session Interceptor |
createSession |
自動的建立HttpSession,用來爲須要使用到HttpSession的攔截器服務。 |
Debugging Interceptor |
debugging |
提供不一樣的調試用的頁面來展示內部的數據情況。 |
Execute and Wait Interceptor |
execAndWait |
在後臺執行Action,同時將用戶帶到一箇中間的等待頁面。 |
Exception Interceptor |
exception |
將異常定位到一個畫面 |
File Upload Interceptor |
fileUpload |
提供文件上傳功能 |
I18n Interceptor |
i18n |
記錄用戶選擇的locale |
Logger Interceptor |
logger |
輸出Action的名字 |
Message Store Interceptor |
store |
存儲或者訪問實現ValidationAware接口的Action類出現的消息,錯誤,字段錯誤等。 |
Model Driven Interceptor |
model-driven |
若是一個類實現了ModelDriven,將getModel獲得的結果放在Value Stack中。 |
Scoped Model Driven |
scoped-model-driven |
若是一個Action實現了ScopedModelDriven,則這個攔截器會從相應的Scope中取出model調用Action的setModel方法將其放入Action內部。 |
Parameters Interceptor |
params |
將請求中的參數設置到Action中去。 |
Prepare Interceptor |
prepare |
若是Acton實現了Preparable,則該攔截器調用Action類的prepare方法。 |
Scope Interceptor |
scope |
將Action狀態存入session和application的簡單方法。 |
Servlet Config Interceptor |
servletConfig |
提供訪問HttpServletRequest和HttpServletResponse的方法,以Map的方式訪問。 |
Static Parameters Interceptor |
staticParams |
從struts.xml文件中將<action>中的<param>中的內容設置到對應的Action中。 |
Roles Interceptor |
roles |
肯定用戶是否具備JAAS指定的Role,不然不予執行。 |
Timer Interceptor |
timer |
輸出Action執行的時間 |
Token Interceptor |
token |
經過Token來避免雙擊 |
Token Session Interceptor |
tokenSession |
和Token Interceptor同樣,不過雙擊的時候把請求的數據存儲在Session中 |
Validation Interceptor |
validation |
使用action-validation.xml文件中定義的內容校驗提交的數據。 |
Workflow Interceptor |
workflow |
調用Action的validate方法,一旦有錯誤返回,從新定位到INPUT畫面 |
Parameter Filter Interceptor |
N/A |
從參數列表中刪除沒必要要的參數 |
Profiling Interceptor |
profiling |
經過參數激活profile |
三.使用系統攔截器完成登陸的防止數據重複提交(token)
1).頁面引用ognl標籤,採用from表單提交
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <s:form action="token.action" method="post"> <s:token></s:token> <s:textfield name="username"></s:textfield> <s:password name="pwd"></s:password> <s:submit value="提交"></s:submit> </s:form> </body> </html>
2).struts.xml:
<?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> <package name="tokenpackage" extends="struts-default"> <action name="token" class="com.action.TokenAction"> <!-- 配置令牌 --> <interceptor-ref name="token"></interceptor-ref> <!-- 引入默認的攔截器 默認的攔截器會幫你把action轉換到action類中 --> <interceptor-ref name="defaultStack"></interceptor-ref> <result name="success"> /success.jsp</result> <!-- 當在session中已經找到相同的值得時候,進行跳轉 --> <result name="invalid.token">/error.jsp</result> </action> </package> </struts>
3).TokenAction:
package com.action; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class TokenAction extends ActionSupport { @Override public String execute() throws Exception { HttpServletRequest request = ServletActionContext.getRequest(); String name=request.getParameter("username"); String pwd=request.getParameter("pwd"); System.out.println(name+"---"+pwd); return SUCCESS; } }
當你登陸的時候,若是你提交兩次相同的數據,就會進入error.jsp的界面。會提醒你不要重複提交數據。對了,當你使用攔截器時在web.xml中配置的過濾器中還須要加上
<filter-name>stuts2</filter-name> <url-pattern>*.jsp</url-pattern>
由於攔截器只能夠攔截action,而過濾器能夠過濾任何內容,好比講html jsp servlet 圖片的路徑等。
再附上一張token工做原理圖: