Struts2 05---攔截器

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).自定義攔截器設置不被攔截的方法:

相關文章
相關標籤/搜索