使用struts2自定義攔截實現統一的身份驗證模式 – JAVA編程語言程序開發技術文章

最近在項目開發中需要進行身份的統一認證,之前.NET的思想就是通過父頁面(基類)進行控制,現在使用struts2進行開發的話,當然還是使用攔截器比較方便,而且比較省事,網上提供瞭很多實現的例子,但是都覺得對於新手而言都有一點不清楚如何使用起來。現在我把我的整個實現方式分享出來。

首先我的項目使用的是spring+struts2+mybatis,數據庫端使用的pgsql ,現在的需求是我們需要在用戶登錄後,將用戶信息存儲在session中,在後續的操作中,需要在每次請求中都判斷session是否失效,失效後就提示過期重新登錄。

本次就使用攔截器來實現,首先我們為驗證建立一個包,取名com.tc.auth,在包下建立action包和資源文件 source.struts,文件結構大概如下圖所示

 
 

接著我們來編寫AuthInterceptor.java文件的code 吧:

[java]
package com.tc.auth.action; 
 
import com.opensymphony.xwork2.ActionInvocation; 
import com.opensymphony.xwork2.interceptor.Interceptor; 
import com.tc.blacktea.common.TCSysConst; 
import com.tc.blacktea.util.SessionUtil; 
 
public class AuthInterceptor implements Interceptor { 
    private static final long serialVersionUID = 5582842221490358379L; 
 
    public void destroy() { 
    } 
 
    /**
     * 在服務啟動的時候執行
     */ 
    public void init() { 
    } 
 
    public String intercept(ActionInvocation actionInvocation) throws Exception { 
        System.out.println("<<<用戶認證檢測攔截器初始化…"); 
        // sessionUser 如果session中不存在用戶在返回index視圖  
        if (SessionUtil.GetSession("USER_SESSION_KEY") == null) {//這裡我使用瞭自己寫的session封裝類  
            return "autherror"; 
        } 
        String result = actionInvocation.invoke();//這裡是繼續原先請求的invoke,不進行其他操作。  
        return result; 
    } 

package com.tc.auth.action;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
import com.tc.blacktea.common.TCSysConst;
import com.tc.blacktea.util.SessionUtil;

public class AuthInterceptor implements Interceptor {
 private static final long serialVersionUID = 5582842221490358379L;

 public void destroy() {
 }

 /**
  * 在服務啟動的時候執行
  */
 public void init() {
 }

 public String intercept(ActionInvocation actionInvocation) throws Exception {
  System.out.println("<<<用戶認證檢測攔截器初始化…");
  // sessionUser 如果session中不存在用戶在返回index視圖
  if (SessionUtil.GetSession("USER_SESSION_KEY") == null) {//這裡我使用瞭自己寫的session封裝類
   return "autherror";
  }
  String result = actionInvocation.invoke();//這裡是繼續原先請求的invoke,不進行其他操作。
  return result;
 }
}

 

接著我們來看下攔截器的配置是如何編寫的:

[html]
<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> 
<struts> 
    <!– default (全局)包配置 –> 
    <package name="userAuth" extends="struts-default" <strong><span style="color:#ff0000;">namespace="/"</span></strong>> 
        <interceptors> 
            <interceptor name="AuthInterceptor" 
                class="<strong><span style="color:#3333ff;">com.tc.auth.action.AuthInterceptor</span></strong>"> 
            </interceptor> 
            <!– 默認的必須放在最下面! –> 
            <interceptor-stack name="userAuthStack"> 
                <interceptor-ref name="AuthInterceptor"></interceptor-ref> 
                <strong><span style="color:#ff0000;"><interceptor-ref name="defaultStack"></interceptor-ref></span></strong> 
            </interceptor-stack> 
        </interceptors> 
        <!– 默認攔截器,此包下所有的ACTION將都被攔截。如果ACTION再定義瞭攔截器,則失效 –> 
        <<strong>default-interceptor-ref</strong> name="userAuthStack"></default-interceptor-ref> 
        <global-results> 
            <!– 首頁 –> 
            <result name="index">/jsp/index.jsp</result> 
            <result name="adminLoginPage">/jsp/index.jsp</result> 
            <result name="autherror">/jsp/Error.jsp</result> 
        </global-results> 
        <!– 用戶退出登錄 –> 
        <!–<action name="existLogin_*" class="existLoginAction" method="{1}">  
            <result name="index">/jsp/Error.jsp</result> </action> –> 
    </package> 
</struts> 
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
 <!– default (全局)包配置 –>
 <package name="userAuth" extends="struts-default" <strong><span style="color:#ff0000;">namespace="/"</span></strong>>
  <interceptors>
   <interceptor name="AuthInterceptor"
    class="<strong><span style="color:#3333ff;">com.tc.auth.action.AuthInterceptor</span></strong>">
   </interceptor>
   <!– 默認的必須放在最下面! –>
   <interceptor-stack name="userAuthStack">
    <interceptor-ref name="AuthInterceptor"></interceptor-ref>
    <strong><span style="color:#ff0000;"><interceptor-ref name="defaultStack"></interceptor-ref></span></strong>
   </interceptor-stack>
  </interceptors>
  <!– 默認攔截器,此包下所有的ACTION將都被攔截。如果ACTION再定義瞭攔截器,則失效 –>
  <<strong>default-interceptor-ref</strong> name="userAuthStack"></default-interceptor-ref>
  <global-results>
   <!– 首頁 –>
   <result name="index">/jsp/index.jsp</result>
   <result name="adminLoginPage">/jsp/index.jsp</result>
   <result name="autherror">/jsp/Error.jsp</result>
  </global-results>
  <!– 用戶退出登錄 –>
  <!–<action name="existLogin_*" class="existLoginAction" method="{1}">
   <result name="index">/jsp/Error.jsp</result> </action> –>
 </package>
</struts>上面的code需要註意幾點:

1、package包的namespace如果是”/“的話,就表示是全局的一個攔截器,你在struts的配置文件中任意位置都可以調用。

2、interceptors/interceptor的class屬性是剛剛上面寫的action的類訪問路徑。

3、interceptors/interceptor-stack的默認攔截器defaultStack必須寫在最後面,否則失效。

4、default-interceptor-ref 是定義所有的action都默認先執行為name屬性的攔截器名稱,完瞭再執行請求上下文的攔截器。

這幾個的聯系看下圖:

 

現在攔截器都定義好瞭後,我們接下來就是使用,

首先我們在user的包下的struts-user.xml文件寫瞭如下的xml配置信息:

[html]
<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> 
<struts> 
    <package name="struts-user" extends="<strong><span style="color:#ff0000;">userAuth</span></strong>" namespace="/user"> 
     
        <!– 定義Action(login.action) –> 
        <action name="userManage" class="com.tc.user.action.UserAction"> 
            <strong><span style="color:#ff0000;"><interceptor-ref name="userAuthStack" /></span></strong> 
            <!– 定義轉發路徑對應的字符串名 –> 
            <result name="error">/jsp/Error.jsp</result> 
            <result name="success">/jsp/user/userlist.jsp</result> 
            <result name="userinfo">/jsp/user/userinfo.jsp</result> 
        </action> 
    </package> 
</struts>     
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
 <package name="struts-user" extends="<strong><span style="color:#ff0000;">userAuth</span></strong>" namespace="/user">
 
  <!– 定義Action(login.action) –>
  <action name="userManage" class="com.tc.user.action.UserAction">
   <strong><span style="color:#ff0000;"><interceptor-ref name="userAuthStack" /></span></strong>
   <!– 定義轉發路徑對應的字符串名 –>
   <result name="error">/jsp/Error.jsp</result>
   <result name="success">/jsp/user/userlist.jsp</result>
   <result name="userinfo">/jsp/user/userinfo.jsp</result>
  </action>
 </package>
</struts>    1、註意package報的extends屬性必須繼承我們自定義的攔截器的package的名稱

2、在我們的action中添加interceptor-ref節點,name屬性指定我們的攔截器名稱即可。

這樣配置完瞭後,我們就可以在任何需要進行身份驗證的action中進行如上的配置就可以實現信息的驗證和過濾操作。隻要會用瞭這些類似的原理後,我們就可以進行如身份驗證、數據過濾、訪問統計、頁面PR等都是可以通過這種類似的手法達到效果,好瞭,不多說瞭,趕快動手試試吧!

 作者:qq415734794
 

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。