struts2關於action攔截器使用方法 現記錄如下
struts2中攔截action
業務要求:
後臺輸入
http://localhost:8080/mia/mia-admin/mia-login.jsp 為登入頁面
驗證使用者名稱和密碼 正確則進入後臺試圖 ,但退出時 ,複製後臺某個頁面地址, 在瀏覽器輸入回車 ,則轉入登入頁面
http://localhost:8080/mia/mia-admin/addarticleURL.action
現在使用
Struts2自定義攔截器
所有的Struts 2的攔截器都直接或間接實現介面com.opensymphony.xwork2.interceptor.Interceptor。該介面提供了三個方法:
1) void init(); 在該攔截器被初始化之後,在該攔截器執行攔截之前,系統回撥該方法。對於每個攔截器而言,此方法只執行一次。
2) void destroy();該方法跟init()方法對應。在攔截器例項被銷燬之前,系統將回調該方法。
3) String intercept(ActionInvocation invocation) throws Exception; 該方法是使用者需要實現的攔截動作。該方法會返回一個字串作為邏輯檢視。
除此之外,繼承類com.opensymphony.xwork2.interceptor.AbstractInterceptor是更簡單的一種實現攔截器類的方式,因為此類提供了init()和destroy()方法的空實現,這樣我們只需要實現intercept方法。
<interceptor …>元素來定義攔截器
<interceptor-ref …>元素來使用攔截器。
使用自定義攔截器來完成使用者許可權的控制:當瀏覽者需要請求執行某個操作時,應用需要先檢查瀏覽者是否登入,以及是否有足夠的許可權來執行該操作。
AuthorityInterceptor.Java copy
- package com.mia.util;
- import java.util.Map;
- import com.opensymphony.xwork2.Action;
- import com.opensymphony.xwork2.ActionContext;
- import com.opensymphony.xwork2.ActionInvocation;
- import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
- @SuppressWarnings("rawtypes")
- public class AuthorityInterceptor extends AbstractInterceptor {
- private static final long serialVersionUID = 1358600090729208361L;
- //攔截Action處理的攔截方法
- @Override
- public String intercept(ActionInvocation invocation) throws Exception {
- // 取得請求相關的ActionContext例項
- ActionContext context=invocation.getInvocationContext();
- Map session=context.getSession();
- //取出名為user的session屬性
- String user=(String)session.get("username");
- //如果沒有登陸,或者登陸所有的使用者名稱不是mia,都返回重新登陸
- if(user!=null && user.equals("mia")){
- System.out.println("合法使用者");
- return invocation.invoke();
- } else {
- //沒有登陸,將伺服器提示設定成一個HttpServletRequest屬性
- context.put("tip","您還沒有登入,請登陸系統");
- return Action.LOGIN;
- }
- }
- }
由於我後臺是一個使用者 所以這裡我限定死了 為mia
配置許可權控制攔截器
struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="articleURL" extends="struts-default">
<interceptors>
<!-- 定義許可權攔截器 -->
<interceptor name="authority" class="com.mia.util.AuthorityInterceptor"></interceptor>
<!-- 定義一個包含許可權許可權攔截器 -->
<interceptor-stack name="mydefault">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="authority"/>
</interceptor-stack>
</interceptors>
<!-- 定義預設攔截器 -->
<default-interceptor-ref name="mydefault"/>
<!-- 定義全域性處理結局 -->
<global-results>
<result name="login">/mia-login.jsp</result>
</global-results>
<action name="addarticleURL" class="AddarticleURL" method="publisharticleURL">
<result name="success" >/mia-admin/public/article/add.jsp</result>
</action>
</package>
</struts>
一旦在某個包下定義了預設攔截器棧,在該包下的所有action都會使用此攔截器棧。對於那些不想使用些攔截器棧的action,則應該將它放置在其它的包下。
執行除錯
在瀏覽器位址列直接輸入http://localhost:8080/mia/mia-admin/addarticleURL.action來訪問,此動作配置了許可權攔截器,所有被轉到登入頁面
登入後 就會登入到後臺了
當然也可以不用配成攔截器棧
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
lt;struts>
<package name="my" extends="struts-default">
<interceptors>
<!-- 定義許可權控制攔截器 -->
<interceptor name="authority" class=" com.mia.util.AuthorityInterceptor"/>
</interceptors>
<!-- 定義全域性處理結果 -->
<global-results>
<!-- 邏輯名為login的結果,對映到/login.jsp頁面 -->
<result name="login">/mia-login.jsp</result>
</global-results>
<action name="addarticleURL" class="AddarticleURL" method="publisharticleURL">
<result name="success" >/mia-admin/public/article/add.jsp</result>
<!-- 使用攔截器 -->
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="authority"/>
</action>
</package>
lt;/struts>