使用struts2自定義攔截實現統一的身份驗證模式

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

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

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


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

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;
	}
}


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

<?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" namespace="/">
		<interceptors>
			<interceptor name="AuthInterceptor"
				class="com.tc.auth.action.AuthInterceptor">
			</interceptor>
			<!-- 默認的必須放在最下面! -->
			<interceptor-stack name="userAuthStack">
				<interceptor-ref name="AuthInterceptor"></interceptor-ref>
				<interceptor-ref name="defaultStack"></interceptor-ref>
			</interceptor-stack>
		</interceptors>
		<!-- 默認攔截器,此包下所有的ACTION將都被攔截。如果ACTION再定義了攔截器,則失效 -->
		<default-interceptor-ref 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配置信息:

<?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="userAuth" namespace="/user">
	
		<!-- 定義Action(login.action) -->
		<action name="userManage" class="com.tc.user.action.UserAction">
			<interceptor-ref name="userAuthStack" />
			<!-- 定義轉發路徑對應的字符串名 -->
			<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等都是可以通過這種類似的手法達到效果,好了,不多說了,趕快動手試試吧!


轉載請註明: http://blog.csdn.net/qq415734794/article/details/7710585

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章