1. 程式人生 > >struts2註解下的攔截器配置

struts2註解下的攔截器配置

   貌似這個這問題已經糾結了半年了,網上找資料也不是很多。上週六除錯通了。借CSDN mark一下吧。

一  、實現

1、 首先上攔截器部分的程式碼

  1. publicclass CheckLoginInterceptor extends AbstractInterceptor {  
  2.     privatestaticfinallong serialVersionUID = 1L;  
  3.     publicstaticfinal String USER_SESSION_KEY = "user";  
  4.     private Logger LOG = Logger.getLogger(CheckLoginInterceptor.
    class);  
  5.     @Override
  6.     public String intercept(ActionInvocation actionInvocation) throws Exception {  
  7.         LOG.info("begin check login interceptor");  
  8.         // 對LoginAction不做該項攔截
  9.         Object action = actionInvocation.getAction();  
  10.         if (action instanceof LoginAction) {  
  11.             LOG.info("exit check login, because this is login action."
    );  
  12.             return actionInvocation.invoke();  
  13.         }  
  14.         // 驗證 session
  15.         Map<String, Object> session = ActionContext.getContext().getSession();  
  16.         String username = (String) session.get(USER_SESSION_KEY);  
  17.         LOG.info("username-----------" + username);  
  18.         if
     (username != null) {  
  19.             // 存在的情況下進行後續操作。
  20.             LOG.info(username + " already login!");  
  21.             return actionInvocation.invoke();  
  22.         } else {  
  23.             // 否則終止後續操作,返回LOGIN
  24.             LOG.info("no login, forward login page!");  
  25.             return Action.LOGIN;  
  26.         }  
  27.     }  
  28. }  

2、然後就是struts.xml的內容
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">
  5. <struts>
  6.     <packagename="custom-default"extends="struts-default">
  7.         <!-- 繼承預設的 struts2 配置檔案 -->
  8.         <interceptors>
  9.             <interceptorname="checkLogin"
  10.                 class="com.cmcc.intt.util.CheckLoginInterceptor"/>
  11.             <interceptor-stackname="checkLoginStack">
  12.                 <interceptor-refname="checkLogin"></interceptor-ref>
  13.                 <interceptor-refname="defaultStack"></interceptor-ref>
  14.             </interceptor-stack>
  15.         </interceptors>
  16.         <!-- 設定全域性 全域性預設的攔截器棧-->
  17.         <default-interceptor-refname="checkLoginStack"></default-interceptor-ref>
  18.         <!-- 定義全域性Result -->
  19.         <global-results>
  20.             <!-- 當返回login檢視名時,轉入/login.jsp頁面 -->
  21.             <resultname="login">/login.jsp</result>
  22.         </global-results>
  23.     </package>
  24. </struts>


3、LoginAction的程式碼(只上關鍵部分,下面也一樣)

  1. @ParentPackage("custom-default")  
  2. @InterceptorRefs(@InterceptorRef("checkLoginStack"))  
  3. @Results( { @Result(name = SUCCESS, location = "/redirect.jsp"),  
  4.         @Result(name = "input", location = "/login.jsp") })  
  5. publicclass LoginAction extends ActionSupport {  
  6.     public String param = null;  
  7.     privatestaticfinallong serialVersionUID = -7146549074248299166L;  
  8.     private Logger LOG = Logger.getLogger(LoginAction.class);  
  9.     public String execute() {  
  10.         LOG.info(param);  
  11.         Map<String, Object> session = ActionContext.getContext().getSession();  
  12.         if (param.equals("1")) {  
  13.             session.put("user""123");  
  14.             return SUCCESS;  
  15.         } else {  
  16.             session.remove("user");  
  17.             return"input";  
  18.         }  
  19.     }  
  20.  (public getter  and setter  ………………)  
  21. }  
附 通過http://localhost:8080/intt/config-browser/index.action   看此action的Action information如下:

Name Type Parameters
input org.apache.struts2.dispatcher.ServletDispatcherResult location = /login.jsp
success org.apache.struts2.dispatcher.ServletDispatcherResult location = /redirect.jsp
login org.apache.struts2.dispatcher.ServletDispatcherResult location = /login.jsp
Name Type
CheckLoginInterceptor com.cmcc.intt.util.CheckLoginInterceptor
……(18個defaultstack的攔截器的第一個) ……………………
……(18個defaultstack的攔截器的第二個) …………
……(18個defaultstack的攔截器的第三個) …………

可以看到  此action繼承了custom-default中定義的login以及CheckLoginInterceptor這個攔截器

4、最後是仿業務邏輯的 程式碼

  1. @ParentPackage("custom-default")  
  2. @InterceptorRefs(@InterceptorRef("checkLoginStack"))  
  3. @Results( { @Result(name = SUCCESS, location = "/redirect.jsp"),  
  4.         @Result(name = "input", location = "/login.jsp") })  
  5. publicclass SignAction extends ActionSupport {  
  6.     privatestaticfinallong serialVersionUID = -1326137892057921638L;  
  7.     public String execute() {  
  8.         System.out.println("SignAction.execute");  
  9.         return SUCCESS;  
  10.     }  
  11. }  

  此action的Action information的跟LoginAction一樣,就不說了

二  執行過程  

1 模仿已登入 

http://localhost:8080/intt/login?param=1  模仿登入(1),完成後瀏覽http://localhost:8080/intt/sign 則顯示 “already login!” (2)

(1)console 顯示 “begin check login interceptor    exit check login, because this is login action.”

(2)console 顯示"begin check login interceptor   username-----------123   123 already login!"

2 模仿未登入

http://localhost:8080/intt/login?param=2  模仿登入(1)。 完成後瀏覽http://localhost:8080/intt/sign 則顯示 “please login” (2)

(1)console 顯示 “begin check login interceptor    exit check login, because this is login action.”

(2)console 顯示"begin check login interceptor   username-----------null    no login, forward login page!     Forwarding to location /login.jsp"

三    總結

                在util包中寫入類似CheckLoginInterceptor 這樣的攔截器程式碼。然後在struts.xml中新增一個package 建立攔截器棧。建好後在action的parentpackage中繼承此package並且攔截器要填入剛才新建的攔截器棧。

                     如果你在新增的package定義LoginAction 的跳轉對映。對不起哦,這樣做是不行滴。但是如果你把註解的兩個包( struts2-config-browser-plugin-2.2.1.jar, struts2-convention-plugin-2.2.1.jar)拿掉就行了。但這樣一做,就不是註解了撒。

四  執行環境

                   下面我把我的執行環境的 jar包貼出來吧

1)        commons-fileupload-1.2.2.jar

2)        commons-io-1.3.2.jar

3)        commons-lang-2.3.jar

4)        commons-logging-1.1.1.jar

5)        freemarker-2.3.16.jar

6)        javassist-3.11.0.GA.jar

7)        log4j-1.2.16.jar

8)        ognl-3.0.1.jar

9)        struts2-config-browser-plugin-2.2.1.jar

10)    struts2-convention-plugin-2.2.1.jar

11)    struts2-core-2.2.1.jar

12)    xwork-core-2.2.1.jar