struts2學習筆記--攔截器(Interceptor)和登錄權限驗證Demo


  •  理解  

    Interceptor攔截器類似於我們學過的過濾器,是可以在action執行前后執行的代碼.是我們做web開發是經常使用的技術,比如權限控制,日志.我們也可以把多個interceptor連在一起組成一個棧.

    攔截器是一種AOP(面向切面編程)思想的編程方式.它提供一種機制是開發者能夠把相對獨立的代碼抽離出來,配置到Action前后執行.

    Struts2攔截器,每個攔截器只有一個對象實例,屬於單例模式,struts2核心功能都是通過攔截器來實現的.

  •  作用

    對action的一些公共處理代碼可以放到攔截器中實現,比如權限控制,日志.

  •  執行流程

                  

 

  • 實現步驟

  1.   編寫攔截器(實現interceptor接口或繼承AbstractInterceptor抽象類即可, )
  2.   在struts.xml中配置攔截器
  3.   在action中使用攔截器

下面寫一個自定義攔截器的例子,判斷用戶是否登錄,就是檢查當前用戶的session中的user屬性是否為空,如果為空,就跳到登錄頁面,否則,繼續執行.

  1.編寫攔截器,在interceptor包下常見一個java類,名為LoginInterceptor,繼承AbstractInterceptor:

public class LoginInterceptor extends AbstractInterceptor{ @Override public String intercept(ActionInvocation invocation) throws Exception { //得到攔截到的action的名稱,看是否是login,當是login的時候,不用進行下面的檢測了,直接執行下一個攔截器
        String actionName=invocation.getProxy().getActionName(); if("login".equals(actionName)){ return invocation.invoke(); } //如果不是login.則判斷是否已登錄,及檢測session中key為user的值是否存在,如果不存在,跳回到登錄頁面
        String user=(String)invocation.getInvocationContext().getSession().get("user"); if(user==null){ System.out.println("未登錄"); return "login"; } //進行到這里.說明用戶已登錄,則跳轉到下一個攔截器
        return invocation.invoke(); } }

2,在struts.xml中配置interceptor,主要特別注意的是,當使用了自定義的攔截器后,默認攔截器將不起作用,默認攔截器實在struts-default.xml中配置的,當引用了自定義攔截器,又想使用struts2提供的默認攔截器功能,需要手動配置:這里我將默認攔截器和我寫的進行登錄權限驗證的攔截器,寫到一個攔截器棧里,然后調用這個默認攔截器棧:

<package name="default" namespace="/" extends="struts-default">
    
     <interceptors>
    <!-- 配置自定義的攔截器-->
          <interceptor name="checkLogin" class="com.wang.interceptor.LoginInterceptor"/>
    <!--配置一個攔截器棧,里面包含自己定義的攔截器和defaultStack默認攔截器-->            
      <interceptor-stack name="myStack">
                <interceptor-ref name="defaultStack"></interceptor-ref>
                <interceptor-ref name="checkLogin"></interceptor-ref>
          </interceptor-stack>
     </interceptors>
    <!--引用默認的攔截器(棧)-->
        <default-interceptor-ref name="myStack"></default-interceptor-ref>
        
    <!--配置一個全局結果集-->
     <global-results> <result name="login">/login.jsp</result> </global-results> <action name="login" class="com.wang.action.LoginAction" > <result>/succ.jsp</result> <result name="error">/login.jsp</result> </action> </package>

 

這里我使用了默認攔截器標簽,即相當於在每個action標簽下,使用了 <interceptor-ref name="myStack"></interceptor-ref>.jsp頁面和LoginAction類這里就省略了.

再來介紹一下方法攔截器,方法攔截器比action攔截器控制的更加精細,大體實現方式和action攔截器相同,不同的是它繼承的是MethodFilterInterceptor類,重寫的是doInterceptor()方法,在struts.xml的配置上也有些不同,大體是這樣:

 <interceptor-ref name="methodInterceptor">
           <!--配置被攔截的方法-->
           <param name="includeMethods">methodA,methodsB</param> 
        <!--配置不被攔截的方法-->
<param name="excludeMethods">methodsC,methodsD</param>
 </interceptor-ref>

 


免責聲明!

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



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