1. 程式人生 > >攔截驗證每一個請求的權限

攔截驗證每一個請求的權限

home 默認 配置 用戶 。。 led 鏈接 每一個 ets

前面做的盡管在界面內看不見沒有權限的鏈接 但能夠直接在地址欄輸入鏈接進行訪問。所以我們這裏要使用攔截器攔截每一個訪問action的請求

? ? 1.struts配置

??

	<package name="default" namespace="/" extends="struts-default">
<!--    聲明攔截器  -->
			<interceptors >
			<interceptor name="CheckPrivilege" class="cn.itcast.oa.Utils.CheckPrivilegeInterceptor"></interceptor>
	<!-- 定義攔截器棧 -->	
			<interceptor-stack name="MyStack">
			        <interceptor-ref name="CheckPrivilege"></interceptor-ref>
			        <interceptor-ref name="defaultStack"></interceptor-ref>
			 </interceptor-stack>
			</interceptors>
<!--    定義默認攔截器棧 -->
 <default-interceptor-ref name="MyStack"></default-interceptor-ref>


<!-- 配置全局 result -->
			<global-results>
			<result name="loginUI">/WEB-INF/jsp/userAction/loginUI.jsp</result>
			<result name="noPrivilegeError">/noPrivilegeError.jsp</result>
			</global-results>
2.實現攔截器類

public class CheckPrivilegeInterceptor implements Interceptor {
	public String intercept(ActionInvocation invocation) throws Exception {
		/*
		 * System.out.println("攔截之前 "); String result = invocation.invoke();
		 * System.out.println("攔截之後 ");
		 */

		// 獲取信息 當前登錄用戶 要訪問的 權限
		User user = (User) ActionContext.getContext().getSession().get("user");
		// ***************************************
		String nameSpace = invocation.getProxy().getNamespace();

		String ActionNanme = invocation.getProxy().getActionName();

		String privUrl = nameSpace + ActionNanme;// 相應的權限Url
		// 1.是否等錄 未登錄就轉到登錄界面
		if (user == null) {
			if (/* 準備去登錄 ,就放行 /user_loginUI /user_login */privUrl
					.startsWith("/user_login")) {
				return invocation.invoke();
			} else
				return "loginUI";
		}
		// 登若錄 是否有權限
		else {
			// 有權限 放行
			if (user.hasPrivilegeByUrl(privUrl)) {
				return invocation.invoke();
			}
			// 無權限 轉到提示界面
			else {
				return "noPrivilegeError";
			}
		}

	}

	public void destroy() {
		// TODO Auto-generated method stub

	}

	public void init() {
		// TODO Auto-generated method stub

	}

}

這裏另一點問題就是 ?對首頁的訪問 ?home_index.action 以及註銷的action 等訪問也被攔截了,比方張三登錄了。本應該跳到首頁,但這個action實現沒被安裝到(初始化的)權限表中,所以會直接跳到無權訪問的錯誤頁面。

。。

。下一篇我們在探討怎麽把這些主要的權限 賦予每一個人。

攔截驗證每一個請求的權限