struts2--實現自定義攔截器


前言:

  本篇文章,我想說清實現攔截器的辦法,還有為什么要這樣做:

目錄:

1.需求目的

2.實現步驟及原理(文字怕描述不清,畫圖描述)

3.代碼

4.總結

一、需求目的

  規范或限制越級訪問(例如:一個客戶端,沒有登錄,直接發送了一個修改密碼的action請求,或者直接退出系統,這些都可能造成bug,再或者直接訪問一些資源文件)

二、實現步驟及原理(畫圖描述)

  第一步:寫自己的攔截器

  

  第二步:配置struts.xml文件

   

三、代碼

  第一步:寫自己的攔截器

  

package com.catit.tms.filter;

import org.apache.struts2.ServletActionContext;
import com.catit.tms.domain.User;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;

/**
 * 攔截action
 * @author phoebe
 *
 */
public class MyActionFilter extends MethodFilterInterceptor{
    private static final long serialVersionUID = 1L;

    @Override
    protected String doIntercept(ActionInvocation invocation) throws Exception {
        //獲取用戶是否登錄
        User user = (User) ServletActionContext.getRequest().getSession().getAttribute("activeUser");
        if(user != null){
            //已登錄放行
            return invocation.invoke();
        }
        //未登錄,跳轉到登錄頁面使其登錄
        return "login";
    }
}

第二步:配置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>
    <!-- 開發者模式打開可以提高開發效率,關閉不容易出錯: -->
    <constant name="struts.devMode" value="false" />
    <package name="myStruts" extends="struts-default" namespace="/">
    
        <!-- 攔截器設置 -->
        <interceptors>
            <!-- 自定義攔截器 -->
            <interceptor name="myActionFilter" class="com.catit.tms.filter.MyActionFilter">
                <!-- 放行方法名為login的方法 -->
                <param name="excludeMethods">login</param>
            </interceptor>
            <!-- 自定義攔截器棧 -->
            <interceptor-stack name="selfStack">
                <!-- 必須引用struts-default.xml中的攔截器棧 -->
                <interceptor-ref name="defaultStack"></interceptor-ref>
                <!-- 自己的攔截器 -->
                <interceptor-ref name="myActionFilter"></interceptor-ref>
            </interceptor-stack>
        </interceptors>
        <!-- 配置全局攔截器為 -->
        <default-interceptor-ref name="selfStack"></default-interceptor-ref>
        <!-- 全局result -->
        <global-results>
            <result name="login">${pageContext.request.contextPath}/login.jsp</result>
        </global-results>
        
        <!-- 需要進行權限控制的頁面訪問 -->
        <action name="page_*_*">
            <interceptor-ref name="selfStack"></interceptor-ref>
            <result type="dispatcher">/WEB-INF/pages/{1}/{2}.jsp</result>
        </action>
        <!-- 用戶 -->
        <action name="user_*" class="userAction" method="{1}">
            <result name="success" type="dispatcher">${pageContext.request.contextPath}/WEB-INF/pages/common/index.jsp</result>
        </action>
        
    </package>
</struts>

 

 

 四、總結

   1、實現攔截器有很多方法,根據需求不同選擇繼承或者實現接口也不相同

  2、includeMethods的優先級大於excludeMethods


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM