亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

struts2攔截器_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

 更新時(shí)間:2017年09月06日 10:53:10   投稿:mrr  
如何使用struts2攔截器,或者自定義攔截器。下面通過實(shí)例代碼給大家分享struts2攔截器的相關(guān)知識(shí),感興趣的朋友參考下吧

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

<interceptor-ref name="checkbox">
 <param name="uncheckedValue">0</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"/>(必須加,否則出錯(cuò))

也可以改為對(duì)全局Action設(shè)置自己需要的攔截器,如下:

在struts.xml里面定義全局的配置設(shè)置

 <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"/>(這句是設(shè)置所有Action自動(dòng)調(diào)用的攔截器堆棧)
 </package>

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

 <package name="LogonAdmin" extends="struts-shop">(這里擴(kuò)展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]

攔截器的工作原理如上圖,每一個(gè)Action請(qǐng)求都包裝在一系列的攔截器的內(nèi)部。攔截器可以在Action執(zhí)行直線做相似的操作也可以在Action執(zhí)行直后做回收操作。 

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

如何自定義一個(gè)攔截器?

自定義一個(gè)攔截器需要三步:

1 自定義一個(gè)實(shí)現(xiàn)Interceptor接口(或者繼承自AbstractInterceptor)的類。

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

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

Interceptor接口聲明了三個(gè)方法:

public interface Interceptor extends Serializable {
 void destroy();
 void init();
 String intercept(ActionInvocation invocation) throws Exception;
}

Init方法在攔截器類被創(chuàng)建之后,在對(duì)Action鏡像攔截之前調(diào)用,相當(dāng)于一個(gè)post-constructor方法,使用這個(gè)方法可以給攔截器類做必要的初始話操作。 

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

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

另外AbstractInterceptor提供了一個(gè)簡(jiǎn)單的Interceptor的實(shí)現(xiàn),這個(gè)實(shí)現(xiàn)為

public abstract class AbstractInterceptor implements Interceptor {
  public void init() {
 }
 public void destroy() {
 }
 public abstract String intercept(ActionInvocation invocation) throws Exception;
}

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

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

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!");
  // 對(duì)LoginAction不做該項(xiàng)攔截
  Object action = actionInvocation.getAction();
  if (action instanceof LoginAction) {
   System.out.println("exit check login, because this is login action.");
   return actionInvocation.invoke();
  }
  // 確認(rèn)Session中是否存在LOGIN
  Map session = actionInvocation.getInvocationContext().getSession();
  String login = (String) session.get(LOGIN_KEY);
  if (login != null && login.length() > 0) {
   // 存在的情況下進(jìn)行后續(xù)操作。
   System.out.println("already login!");
   return actionInvocation.invoke();
  } else {
   // 否則終止后續(xù)操作,返回LOGIN
   System.out.println("no login, forward login page!");
   return LOGIN_PAGE;
  }
 }
}

注冊(cè)攔截器

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

將上述攔截器設(shè)定為默認(rèn)攔截器:

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

這樣在后續(xù)同一個(gè)package內(nèi)部的所有Action執(zhí)行之前都會(huì)被login攔截。

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

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

注冊(cè)并引用Interceptor

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

可以將多個(gè)攔截器合并在一起作為一個(gè)堆棧調(diào)用,當(dāng)一個(gè)攔截器堆棧被附加到一個(gè)Action的時(shí)候,要想Action執(zhí)行,必須執(zhí)行攔截器堆棧中的每一個(gè)攔截器。

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

上述說明的攔截器在默認(rèn)的Struts2應(yīng)用中,根據(jù)慣例配置了若干個(gè)攔截器堆棧,詳細(xì)情參看struts-default.xml

其中有一個(gè)攔截器堆棧比較特殊,他會(huì)應(yīng)用在默認(rèn)的每一個(gè)Action上。

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

每一個(gè)攔截器都可以配置參數(shù),有兩種方式配置參數(shù),一是針對(duì)每一個(gè)攔截器定義參數(shù),二是針對(duì)一個(gè)攔截器堆棧統(tǒng)一定義所有的參數(shù),例如:

<interceptor-ref name="validation">
 <param name="excludeMethods">myValidationExcudeMethod</param>
</interceptor-ref>
<interceptor-ref name="workflow">
 <param name="excludeMethods">myWorkflowExcludeMethod</param>
</interceptor-ref>

或者

<interceptor-ref name="defaultStack">
 <param name="validation.excludeMethods">myValidationExcludeMethod</param>
 <param name="workflow.excludeMethods">myWorkflowExcludeMethod</param>
</interceptor-ref> 

每一個(gè)攔截器都有兩個(gè)默認(rèn)的參數(shù):

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

需要說明的幾點(diǎn):

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

<interceptor-stack name="xaStack">
 <interceptor-ref name="thisWillRunFirstInterceptor"/>
 <interceptor-ref name="thisWillRunNextInterceptor"/>
 <interceptor-ref name="followedByThisInterceptor"/>
 <interceptor-ref name="thisWillRunLastInterceptor"/>
</interceptor-stack>

的執(zhí)行順序?yàn)椋?/p>

thisWillRunFirstInterceptor
 thisWillRunNextInterceptor
 followedByThisInterceptor
  thisWillRunLastInterceptor
  MyAction1
  MyAction2 (chain)
  MyPreResultListener
  MyResult (result)
  thisWillRunLastInterceptor
 followedByThisInterceptor
 thisWillRunNextInterceptor
thisWillRunFirstInterceptor 

2 使用默認(rèn)攔截器配置每個(gè)Action都需要的攔截器堆棧,例如:

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

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

<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

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

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

或者實(shí)現(xiàn)相應(yīng)的接口:

HttpSession            SessionAware
HttpServletRequest     ServletRequestAware
HttpServletResponse    ServletResponseAware

Struts2自定義攔截器實(shí)例—只允許從登錄頁面進(jìn)入系統(tǒng)

【1】struts.xml:      

 <!-- 定義一個(gè)攔截器 --> 
  <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> 
   <!-- 當(dāng)返回login視圖名時(shí),轉(zhuǎn)入/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> 
  <!--驗(yàn)證登錄用戶信息 -->
  <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:

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 { 
  // 取得請(qǐng)求相關(guān)的ActionContext實(shí)例 
  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; //返回一個(gè)叫l(wèi)ogin的result結(jié)果
 } 
} 

【3】進(jìn)入主頁面的Action:org.action.showAction

package org.action;
import com.opensymphony.xwork2.ActionSupport; 
public class showAction extends ActionSupport { 
 public String execute() { 
 return "success"; 
 } 
} 

【4】LoginAction:

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那么就會(huì)被自定義攔截器攔住,攔截器檢查session中

是否有值,有證明用戶已經(jīng)登錄,沒有則為沒有登錄,那么就會(huì)被跳轉(zhuǎn)到登陸頁面。

總結(jié)

以上所述是小編給大家介紹的struts2攔截器,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • springboot-assembly自定義打包全過程

    springboot-assembly自定義打包全過程

    這篇文章主要介紹了springboot-assembly自定義打包全過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 數(shù)組在java中的擴(kuò)容的實(shí)例方法

    數(shù)組在java中的擴(kuò)容的實(shí)例方法

    在本篇文章里小編給大家分享的是一篇關(guān)于數(shù)組在java中的擴(kuò)容的實(shí)例方法內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-01-01
  • Java版本和C++版本的二叉樹序列化與反序列化

    Java版本和C++版本的二叉樹序列化與反序列化

    這篇文章主要介紹了Java版本和C++版本的二叉樹序列化與反序列化,二叉樹就是節(jié)點(diǎn)在內(nèi)存區(qū)域中串聯(lián)起來的,但是如果掉電,內(nèi)存上的數(shù)據(jù)就沒有了。為了保存這種結(jié)構(gòu),將二叉樹用字符串的形式保存到硬盤中,這就是序列化;從字符串形式轉(zhuǎn)換為二叉樹,這就是反序列化
    2022-06-06
  • Java實(shí)現(xiàn)線程插隊(duì)的示例代碼

    Java實(shí)現(xiàn)線程插隊(duì)的示例代碼

    在編寫多線程的業(yè)務(wù)時(shí),會(huì)遇到讓一個(gè)線程優(yōu)先于其他線程運(yùn)行的情況,除了可以設(shè)置線程的優(yōu)先級(jí)高于其他線程,還有更直接的方式:線程插隊(duì)。本文將用Java實(shí)現(xiàn)線程插隊(duì),需要的可以參考一下
    2022-08-08
  • Java接口和抽象類實(shí)例分析

    Java接口和抽象類實(shí)例分析

    這篇文章主要介紹了Java接口和抽象類,實(shí)例分析了java接口與抽象類的概念與相關(guān)使用技巧,需要的朋友可以參考下
    2015-05-05
  • Java常用測(cè)試工具大全

    Java常用測(cè)試工具大全

    這篇文章主要為大家詳細(xì)介紹了Java常用測(cè)試工具,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • Mybatis返回map集合時(shí),列的順序與select不一致問題

    Mybatis返回map集合時(shí),列的順序與select不一致問題

    這篇文章主要介紹了Mybatis返回map集合時(shí),列的順序與select不一致問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • SpringBoot參數(shù)校驗(yàn)之@Valid的使用詳解

    SpringBoot參數(shù)校驗(yàn)之@Valid的使用詳解

    這篇文章主要通過示例為大家詳細(xì)介紹一下介紹了SpringBoot參數(shù)校驗(yàn)中@Valid的使用方法,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2022-06-06
  • javap命令的使用技巧

    javap命令的使用技巧

    本篇文章給大家分享了關(guān)于JAVA中關(guān)于javap命令的使用技巧以及相關(guān)代碼分享,有需要的朋友參考學(xué)習(xí)下。
    2018-05-05
  • log4j2采用AsyncLogger出現(xiàn)的錯(cuò)誤及解決方案

    log4j2采用AsyncLogger出現(xiàn)的錯(cuò)誤及解決方案

    這篇文章主要介紹了log4j2采用AsyncLogger出現(xiàn)的錯(cuò)誤及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12

最新評(píng)論