一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - struts2攔截器_動力節點Java學院整理

struts2攔截器_動力節點Java學院整理

2020-12-28 09:57Java教程網 Java教程

如何使用struts2攔截器,或者自定義攔截器。下面通過實例代碼給大家分享struts2攔截器的相關知識,感興趣的朋友參考下吧

如何使用struts2攔截器,或者自定義攔截器。特別注意,在使用攔截器的時候,在Action里面必須最后一定要引用struts2自帶的攔截器缺省堆棧defaultStack,如下(這里我是引用了struts2自帶的checkbox攔截器):

?
1
2
3
4
<interceptor-ref name="checkbox">
 <param name="uncheckedValue">0</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"/>(必須加,否則出錯)

也可以改為對全局Action設置自己需要的攔截器,如下:

在struts.xml里面定義全局的配置設置

?
1
2
3
4
5
6
7
8
9
10
11
<package name="struts-shop" extends="struts-default">
<interceptors>
 <interceptor-stack name="myStack">
 <interceptor-ref name="checkbox">
  <param name="uncheckedValue">0</param>
 </interceptor-ref>
 <interceptor-ref name="defaultStack"/>
 </interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"/>(這句是設置所有Action自動調用的攔截器堆棧)
</package>

struts-action.xml里面配置Action如下:

?
1
2
3
4
5
6
7
8
9
10
<package name="LogonAdmin" extends="struts-shop">(這里擴展struts.xml里面定義的配置就可以了)
<action name="logon" class="logonAction">
 <result>/jsp/smeishop/admin/index.jsp</result>
 <result name="error">/jsp/smeishop/admin/logon.jsp</result>
 <result name="input">/jsp/smeishop/admin/logon.jsp</result>
</action>
<action name="logout" class="logoutAction">
 <result>/jsp/smeishop/admin/logon.jsp</result>
</action>
</package>

你的攔截器可以正常工作了

struts2自帶的配置及其攔截器配置

Struts2 攔截器 [Interceptor]

struts2攔截器_動力節點Java學院整理

攔截器的工作原理如上圖,每一個Action請求都包裝在一系列的攔截器的內部。攔截器可以在Action執行直線做相似的操作也可以在Action執行直后做回收操作。 

每一個Action既可以將操作轉交給下面的攔截器,Action也可以直接退出操作返回客戶既定的畫面。 

如何自定義一個攔截器?

自定義一個攔截器需要三步:

1 自定義一個實現Interceptor接口(或者繼承自AbstractInterceptor)的類。

2 在strutx.xml中注冊上一步中定義的攔截器。

3 在需要使用的Action中引用上述定義的攔截器,為了方便也可將攔截器定義為默認的攔截器,這樣在不加特殊聲明的情況下所有的Action都被這個攔截器攔截。 

Interceptor接口聲明了三個方法:

?
1
2
3
4
5
public interface Interceptor extends Serializable {
 void destroy();
 void init();
 String intercept(ActionInvocation invocation) throws Exception;
}

Init方法在攔截器類被創建之后,在對Action鏡像攔截之前調用,相當于一個post-constructor方法,使用這個方法可以給攔截器類做必要的初始話操作。 

Destroy方法在攔截器被垃圾回收之前調用,用來回收init方法初始化的資源。 

Intercept是攔截器的主要攔截方法,如果需要調用后續的Action或者攔截器,只需要在該方法中調用invocation.invoke()方法即可,在該方法調用的前后可以插入Action調用前后攔截器需要做的方法。如果不需要調用后續的方法,則返回一個String類型的對象即可,例如Action.SUCCESS。

另外AbstractInterceptor提供了一個簡單的Interceptor的實現,這個實現為

?
1
2
3
4
5
6
7
public abstract class AbstractInterceptor implements Interceptor {
  public void init() {
 }
 public void destroy() {
 }
 public abstract String intercept(ActionInvocation invocation) throws Exception;
}

在不需要編寫init和destroy方法的時候,只需要從AbstractInterceptor繼承而來,實現intercept方法即可。 

我們嘗試編寫一個Session過濾用的攔截器,該攔截器查看用戶Session中是否存在特定的屬性(LOGIN屬性)如果不存在,中止后續操作定位到LOGIN,否則執行原定操作,代碼為:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class CheckLoginInterceptor extends AbstractInterceptor {
 public static final String LOGIN_KEY = "LOGIN";
 public static final String LOGIN_PAGE = "global.login";
 public String intercept(ActionInvocation actionInvocation) throws Exception {
  System.out.println("begin check login interceptor!");
  // 對LoginAction不做該項攔截
  Object action = actionInvocation.getAction();
  if (action instanceof LoginAction) {
   System.out.println("exit check login, because this is login action.");
   return actionInvocation.invoke();
  }
  // 確認Session中是否存在LOGIN
  Map session = actionInvocation.getInvocationContext().getSession();
  String login = (String) session.get(LOGIN_KEY);
  if (login != null && login.length() > 0) {
   // 存在的情況下進行后續操作。
   System.out.println("already login!");
   return actionInvocation.invoke();
  } else {
   // 否則終止后續操作,返回LOGIN
   System.out.println("no login, forward login page!");
   return LOGIN_PAGE;
  }
 }
}

注冊攔截器

?
1
2
3
4
5
6
7
8
9
<interceptors>
   <interceptor
name="login"
class="com.jpleasure.teamware.util.CheckLoginInterceptor"/>
   <interceptor-stack name="teamwareStack">
    <interceptor-ref name="login"/>
    <interceptor-ref name="defaultStack"/>
   </interceptor-stack>
</interceptors>

將上述攔截器設定為默認攔截器:

?
1
<default-interceptor-ref name="teamwareStack"/>

這樣在后續同一個package內部的所有Action執行之前都會被login攔截。

Struts2(XWork)提供的攔截器的功能說明:

 

攔截器
名字
說明
Alias Interceptor
alias
在不同請求之間將請求參數在不同名字件轉換,請求內容不變
Chaining Interceptor
chain
讓前一個Action的屬性可以被后一個Action訪問,現在和chain類型的result(<result type=”chain”>)結合使用。
Checkbox Interceptor
checkbox
添加了checkbox自動處理代碼,將沒有選中的checkbox的內容設定為false,而html默認情況下不提交沒有選中的checkbox。
Cookies Interceptor
cookies
使用配置的name,value來是指cookies
Conversion Error Interceptor
conversionError
將錯誤從ActionContext中添加到Action的屬性字段中。
Create Session Interceptor
createSession
自動的創建HttpSession,用來為需要使用到HttpSession的攔截器服務。
Debugging Interceptor
debugging
提供不同的調試用的頁面來展現內部的數據狀況。
Execute and Wait Interceptor
execAndWait
在后臺執行Action,同時將用戶帶到一個中間的等待頁面。
Exception Interceptor
exception
將異常定位到一個畫面
File Upload Interceptor
fileUpload
提供文件上傳功能
I18n Interceptor
i18n
記錄用戶選擇的locale
Logger Interceptor
logger
輸出Action的名字
Message Store Interceptor
store
存儲或者訪問實現ValidationAware接口的Action類出現的消息,錯誤,字段錯誤等。
Model Driven Interceptor
model-driven
如果一個類實現了ModelDriven,將getModel得到的結果放在Value Stack中。
Scoped Model Driven
scoped-model-driven
如果一個Action實現了ScopedModelDriven,則這個攔截器會從相應的Scope中取出model調用Action的setModel方法將其放入Action內部。
Parameters Interceptor
params
將請求中的參數設置到Action中去。
Prepare Interceptor
prepare
如果Acton實現了Preparable,則該攔截器調用Action類的prepare方法。
Scope Interceptor
scope
將Action狀態存入session和application的簡單方法。
Servlet Config Interceptor
servletConfig
提供訪問HttpServletRequest和HttpServletResponse的方法,以Map的方式訪問。
Static Parameters Interceptor
staticParams
從struts.xml文件中將<action>中的<param>中的內容設置到對應的Action中。
Roles Interceptor
roles
確定用戶是否具有JAAS指定的Role,否則不予執行。
Timer Interceptor
timer
輸出Action執行的時間
Token Interceptor
token
通過Token來避免雙擊
Token Session Interceptor
tokenSession
和Token Interceptor一樣,不過雙擊的時候把請求的數據存儲在Session中
Validation Interceptor
validation
使用action-validation.xml文件中定義的內容校驗提交的數據。
Workflow Interceptor
workflow
調用Action的validate方法,一旦有錯誤返回,重新定位到INPUT畫面
Parameter Filter Interceptor
N/A
從參數列表中刪除不必要的參數
Profiling Interceptor
profiling
通過參數激活profile

 

注冊并引用Interceptor

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<package name="default" extends="struts-default">
 <interceptors>
  <interceptor name="timer" class=".."/>
  <interceptor name="logger" class=".."/>
 </interceptors>
 
 <action name="login" class="tutorial.Login">
  <interceptor-ref name="timer"/>
  <interceptor-ref name="logger"/>
  <result name="input">login.jsp</result>
  <result name="success"
   type="redirect-action">/secure/home</result>
 </action>
</package>

可以將多個攔截器合并在一起作為一個堆棧調用,當一個攔截器堆棧被附加到一個Action的時候,要想Action執行,必須執行攔截器堆棧中的每一個攔截器。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<package name="default" extends="struts-default">
 <interceptors>
  <interceptor name="timer" class=".."/>
  <interceptor name="logger" class=".."/>
  <interceptor-stack name="myStack">
   <interceptor-ref name="timer"/>
   <interceptor-ref name="logger"/>
  </interceptor-stack>
 </interceptors>
 <action name="login" class="tutuorial.Login">
   <interceptor-ref name="myStack"/>
   <result name="input">login.jsp</result>
   <result name="success"
    type="redirect-action">/secure/home</result>
 </action>
</package>

上述說明的攔截器在默認的Struts2應用中,根據慣例配置了若干個攔截器堆棧,詳細情參看struts-default.xml

其中有一個攔截器堆棧比較特殊,他會應用在默認的每一個Action上。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<interceptor-stack name="defaultStack">
 <interceptor-ref name="exception"/>
 <interceptor-ref name="alias"/>
 <interceptor-ref name="servletConfig"/>
 <interceptor-ref name="prepare"/>
 <interceptor-ref name="i18n"/>
 <interceptor-ref name="chain"/>
 <interceptor-ref name="debugging"/>
 <interceptor-ref name="profiling"/>
 <interceptor-ref name="scopedModelDriven"/>
 <interceptor-ref name="modelDriven"/>
 <interceptor-ref name="fileUpload"/>
 <interceptor-ref name="checkbox"/>
 <interceptor-ref name="staticParams"/>
 <interceptor-ref name="params">
  <param name="excludeParams">dojo"..*</param>
 </interceptor-ref>
 <interceptor-ref name="conversionError"/>
 <interceptor-ref name="validation">
  <param name="excludeMethods">input,back,cancel,browse</param>
 </interceptor-ref>
 <interceptor-ref name="workflow">
  <param name="excludeMethods">input,back,cancel,browse</param>
 </interceptor-ref>
</interceptor-stack>

每一個攔截器都可以配置參數,有兩種方式配置參數,一是針對每一個攔截器定義參數,二是針對一個攔截器堆棧統一定義所有的參數,例如:

?
1
2
3
4
5
6
<interceptor-ref name="validation">
 <param name="excludeMethods">myValidationExcudeMethod</param>
</interceptor-ref>
<interceptor-ref name="workflow">
 <param name="excludeMethods">myWorkflowExcludeMethod</param>
</interceptor-ref>

或者

?
1
2
3
4
<interceptor-ref name="defaultStack">
 <param name="validation.excludeMethods">myValidationExcludeMethod</param>
 <param name="workflow.excludeMethods">myWorkflowExcludeMethod</param>
</interceptor-ref>

每一個攔截器都有兩個默認的參數:

excludeMethods - 過濾掉不使用攔截器的方法和
includeMethods – 使用攔截器的方法。 

需要說明的幾點:

1 攔截器執行的順序按照定義的順序執行,例如:

?
1
2
3
4
5
6
<interceptor-stack name="xaStack">
 <interceptor-ref name="thisWillRunFirstInterceptor"/>
 <interceptor-ref name="thisWillRunNextInterceptor"/>
 <interceptor-ref name="followedByThisInterceptor"/>
 <interceptor-ref name="thisWillRunLastInterceptor"/>
</interceptor-stack>

的執行順序為:

?
1
2
3
4
5
6
7
8
9
10
11
12
thisWillRunFirstInterceptor
 thisWillRunNextInterceptor
 followedByThisInterceptor
  thisWillRunLastInterceptor
  MyAction1
  MyAction2 (chain)
  MyPreResultListener
  MyResult (result)
  thisWillRunLastInterceptor
 followedByThisInterceptor
 thisWillRunNextInterceptor
thisWillRunFirstInterceptor

2 使用默認攔截器配置每個Action都需要的攔截器堆棧,例如:

?
1
2
3
4
5
6
7
<action name="login" class="tutorial.Login">
  <interceptor-ref name="timer"/>
  <interceptor-ref name="logger"/>
  <interceptor-ref name="default-stack"/>
  <result name="input">login.jsp</result>
  <result type="redirect-action">/secure/home</result>
</action>

可以按照如下的方式定義:

?
1
2
3
4
5
6
7
8
9
10
11
12
<interceptors>
  <interceptor-stack name="myStack">
  <interceptor-ref name="timer"/>
  <interceptor-ref name="logger"/>
  <interceptor-ref name="default-stack"/>
  </interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"/>
<action name="login" class="tutorial.Login">
  <result name="input">login.jsp</result>
  <result type="redirect-action">/secure/home</result>
</action>

3 如何訪問HttpServletRequest,HttpServletResponse或者HttpSession

有兩種方法可以達到效果,使用ActionContext:

?
1
Map attibutes = ActionContext.getContext().getSession();

或者實現相應的接口:

HttpSession            SessionAware
HttpServletRequest     ServletRequestAware
HttpServletResponse    ServletResponseAware

Struts2自定義攔截器實例—只允許從登錄頁面進入系統

【1】struts.xml:      

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<!-- 定義一個攔截器 -->
 <interceptors>
  <interceptor name="authority"
   class="org.interceptot.LoginInterceptor">
  </interceptor>
  <!-- 攔截器棧 -->
  <interceptor-stack name="mydefault">
   <interceptor-ref name="defaultStack" />
   <interceptor-ref name="authority" />
  </interceptor-stack>
 </interceptors>
  <!-- 定義全局Result -->
 <global-results>
  <!-- 當返回login視圖名時,轉入/login.jsp頁面 -->
  <result name="login">/login.jsp</result>
 </global-results>
 <action name="show" class="org.action.showAction">
  <result name="success">/main.jsp</result>
  <!-- 使用此攔截器 -->
  <interceptor-ref name="mydefault" />
 </action>
 <!--驗證登錄用戶信息 -->
 <action name="login" class="org.action.loginAction" method="execute">
  <result name="error">/login.jsp</result>
  <result name="input">/login.jsp</result>
 </action>

【2】自定義攔截器org.interceptot.LoginInterceptor:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package org.interceptot;
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;
public class LoginInterceptor extends AbstractInterceptor {
 @Override
 public String intercept(ActionInvocation invocation) throws Exception {
  // 取得請求相關的ActionContext實例
  ActionContext ctx = invocation.getInvocationContext();
  Map session = ctx.getSession();
  String user = (String) session.get("username");
  // 如果沒有登陸,即用戶名不存在,都返回重新登陸
  System.out.println("user:"+user);
  if (user != null) {
   System.out.println("test");
   return invocation.invoke();
  }
  System.out.println("你還沒有登錄");
  ctx.put("tip", "你還沒有登錄");
  return Action.LOGIN; //返回一個叫login的result結果
 }
}

【3】進入主頁面的Action:org.action.showAction

?
1
2
3
4
5
6
7
package org.action;
import com.opensymphony.xwork2.ActionSupport;
public class showAction extends ActionSupport {
 public String execute() {
 return "success";
 }
}

【4】LoginAction:

?
1
2
3
4
5
6
7
8
9
10
11
private boolean isInvalid(String value) { 
return (value == null || value.length() == 0); 
}
if (isInvalid(user.getUsername()))
  return INPUT; 
 if (isInvalid(user.getPassword())) 
  return INPUT;
 //登錄成功將User放入session中
HttpServletRequest request = ServletActionContext.getRequest();
Map map=ActionContext.getContext().getSession();
map.put("username", user.getUsername());

【5】如果我們通過show.action訪問main.jsp那么就會被自定義攔截器攔住,攔截器檢查session中

是否有值,有證明用戶已經登錄,沒有則為沒有登錄,那么就會被跳轉到登陸頁面。

總結

以上所述是小編給大家介紹的struts2攔截器,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日本免费在线播放 | www.麻豆| 深夜免费在线视频 | 3d蒂法精品啪啪一区二区免费 | 免费福利资源站在线视频 | 欧美18-19sex性处 | 水蜜臀 | 人与禽交3d动漫羞羞动漫 | 99在线视频精品 | 亚洲第一区在线观看 | 欧美日韩亚洲国内综合网俺 | 国产欧美一区二区成人影院 | 久久久久久久国产精品视频 | 麻豆视频网| 欧美高清在线精品一区 | 天天干天天爽天天操 | 国产精品一二三 | 丁香网五月天 | 视频一区二区在线 | 亚洲欧美一区二区三区在线观看 | 第一次做m被调教经历 | 美女校花被调教出奶水 | 二次元美女互摸隐私互扒 | 日本b站一卡二不卡三卡四卡 | 美女bbxx美女bbb | 日韩精品免费一区二区 | 欧美日韩一品道 | 国产草逼视频 | 99久久精品免费看国产一区 | 欧美日韩精品一区二区三区视频播放 | 国产在亚洲线视频观看 | 99精品国产成人一区二区 | 99ri在线精品视频在线播放 | 人禽l交免费视频观看+视频 | 99九九精品视频 | 97超pen个人视频公开视频视 | 国产亚洲一级精品久久 | 粉嫩高中生第一次不戴套 | 美女视频黄a| 热99精品只有里视频最新 | 四虎精品成人免费观看 |