1、Struts2攔截器原理:java
Struts2攔截器的實現原理相對簡單,使用了aop思想和責任鏈模式,當請求struts2的action時,Struts 2會查找配置文件,並根據其配置實例化相對的攔截器對象,而後串成一個列表,最後一個一個地調用列表中的攔截器。apache
1).aop思想:面向切面編程(在不修改源代碼的狀況下進行功能的擴展)。編程
2).責任鏈模式:執行多個攔截器,一個一個的進行執行,在執行完後進入下一個攔截器以前,前一個的攔截器會作相似於放行的操做。服務器
2、Struts2 攔截器接口實現:session
Struts2規定用戶自定義攔截器須要實現Interceptor接口。該接口聲明瞭3個方法:jsp
package com.action; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.Interceptor; public class MyInterceptor implements Interceptor{ //結束:當攔截器銷燬時執行的方法; @Override public void destroy() { } //初始化 :在服務器起動的時候加載一次,而且只加載一次; @Override public void init() { } //放行 :若是知足要求繼續往下執行調用invoke方法,不然自定義返回信息 @Override public String intercept(ActionInvocation arg0) throws Exception {
//是若是隻有一個攔截器執行完這個方法後,會返回給視圖,若是有多個攔截器,它順序的執行完全部的攔截器,才返回給視圖,也就是調用後面的action繼續執行。 arg0.invoke(); return null; } }
可是,這個接口須要實現三個方法,其中的init().destroy()是系統默認執行的,咱們不須要管它,因此,在咱們寫攔截器的時候,還能夠選擇繼承MethodFilterInterceptor類:ide
package com.zking.interceptor; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor; public class LoginInterceptor extends MethodFilterInterceptor{ @Override protected String doIntercept(ActionInvocation actionInvocation) throws Exception { //攔截器所須要執行的業務邏輯 HttpServletRequest request=ServletActionContext.getRequest(); String name=(String)request.getSession().getAttribute("login"); if(name!=null){ //成功則繼續執行 actionInvocation.invoke(); return Action.SUCCESS; } else{ //失敗則返回信息給struts.xml return Action.ERROR; } } }
3、struts.xml攔截器詳細配置:spa
3):系統默認攔截器:code
2):自定義攔截器: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="mypackage" extends="struts-default"> <action name="login" class="com.action.LoginAction"> <!-- 配置令牌 --> <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> <!-- 自定義攔截器 --> <package name="mylogin" extends="struts-default"> <!-- 建立攔截器 --> <interceptors> <interceptor name="MyInterceptor" class="com.zking.interceptor.MyInterceptor"></interceptor> </interceptors> <action name="userlogin" class="com.action.LoginActionInterceptor" method="login"> <!-- 引用攔截器 --> <interceptor-ref name="MyInterceptor"> <param name="excludeMethods">login</param> </interceptor-ref> <result name="success">/success.jsp</result> <result name="login">/loginInterceptor.jsp</result> </action> </package>
3).自定義攔截器設置不被攔截的方法: