前言:
本篇文章,我想說清實現攔截器的辦法,還有為什么要這樣做:
目錄:
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