了解java Struts攔截器的相關(guān)操作
實(shí)現(xiàn)aop的方式
用于實(shí)現(xiàn)action之前
- 一般用于事物操作.
- 一般用于對(duì)某些未授權(quán)的頁(yè)面訪問的時(shí)候,進(jìn)行攔截操作,攔截非法訪問.
開箱即用攔截器
<!-- 攔截器 --> <interceptor-ref name="params"/> <!-- 傳遞屬性攔截器 --> <interceptor-ref name="timer"/> <!-- 測(cè)算執(zhí)行時(shí)間 -->
必須有傳遞屬性這個(gè)攔截器
運(yùn)行輸出日志如下
2019-03-24 03:50:19.231 [DEBUG] com.opensymphony.xwork2.ognl.SecurityMemberAccess.isAccessible(SecurityMemberAccess.java:67) - Checking access for [target: com.ming.HelloWorldAction@33e67d25, member: public java.lang.String com.ming.HelloWorldAction.getName(), property: name] 2019-03-24 03:50:19.232 [INFO ] com.opensymphony.xwork2.interceptor.TimerInterceptor.doLog(TimerInterceptor.java:205) - Executed action [//hello!execute] took 12 ms.
可以看到這個(gè)action一共運(yùn)行耗時(shí)12ms
自定義攔截器
需要繼承該抽象類,并實(shí)現(xiàn)其方法 即 com.opensymphony.xwork2.interceptor.AbstractInterceptor 抽象類
代碼如下
package com.ming;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class MyInterceptor extends AbstractInterceptor {
/**
* Override to handle interception
*
* @param invocation
*/
@Override
public String intercept(ActionInvocation invocation) throws Exception {
return null;
}
}
實(shí)現(xiàn)該類的interceptor方法
package com.ming;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class MyInterceptor extends AbstractInterceptor {
/**
* Override to handle interception
*
* @param invocation
*/
@Override
public String intercept(ActionInvocation invocation) throws Exception {
Logger logger = LogManager.getLogger();
// 執(zhí)行結(jié)果前
String output = "hi before";
logger.info(output);
// 開始執(zhí)行Action
String result = invocation.invoke();
// 執(zhí)行結(jié)果后
output = "hi after";
logger.info(output);
// 繼續(xù)傳遞到下一個(gè)攔截器
return result;
}
}
更改配置文件
<!-- 攔截器 --> <interceptor-ref name="params"/> <!-- 傳遞屬性攔截器 --> <interceptor-ref name="timer"/> <!-- 測(cè)算執(zhí)行時(shí)間 --> <interceptor-ref name="MyInterceptor"/> <!-- 成功返回頁(yè)面 --> <result name="success">/HelloWorld.jsp</result> <result name="error">/error.html</result>
控制臺(tái)輸出結(jié)果如下
2019-03-24 04:37:24.086 [DEBUG] com.opensymphony.xwork2.ognl.SecurityMemberAccess.isAccessible(SecurityMemberAccess.java:67) - Checking access for [target: com.ming.HelloWorldAction@5121691d, member: public void com.ming.HelloWorldAction.setName(java.lang.String), property: name] 2019-03-24 04:37:24.087 [INFO ] com.ming.MyInterceptor.intercept(MyInterceptor.java:19) - hi before 2019-03-24 04:37:24.089 [DEBUG] com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:430) - Executing action method = execute 2019-03-24 04:37:24.106 [DEBUG] com.opensymphony.xwork2.ognl.SecurityMemberAccess.isAccessible(SecurityMemberAccess.java:67) - Checking access for [target: com.ming.HelloWorldAction@5121691d, member: public java.lang.String com.ming.HelloWorldAction.execute() throws java.lang.Exception, property: null] 2019-03-24 04:37:24.143 [DEBUG] com.opensymphony.xwork2.ognl.SecurityMemberAccess.isAccessible(SecurityMemberAccess.java:67) - Checking access for [target: org.apache.struts2.result.ServletDispatcherResult@2e4369c6, member: public void org.apache.struts2.result.StrutsResultSupport.setLocation(java.lang.String), property: location] 2019-03-24 04:37:24.143 [DEBUG] com.opensymphony.xwork2.ognl.SecurityMemberAccess.isAccessible(SecurityMemberAccess.java:67) - Checking access for [target: org.apache.struts2.result.ServletDispatcherResult@2e4369c6, member: public void org.apache.struts2.result.StrutsResultSupport.setLocation(java.lang.String), property: location] 2019-03-24 04:37:24.150 [DEBUG] org.apache.struts2.result.ServletDispatcherResult.doExecute(ServletDispatcherResult.java:127) - Forwarding to location: /error.html 2019-03-24 04:37:24.158 [DEBUG] com.opensymphony.xwork2.conversion.impl.InstantiatingNullHandler.nullPropertyValue(InstantiatingNullHandler.java:98) - Entering nullPropertyValue [target=[com.ming.HelloWorldAction@5121691d, com.opensymphony.xwork2.DefaultTextProvider@2e34626e], property=struts] 2019-03-24 04:37:24.175 [INFO ] com.ming.MyInterceptor.intercept(MyInterceptor.java:26) - hi after 2019-03-24 04:37:24.176 [INFO ] com.opensymphony.xwork2.interceptor.TimerInterceptor.doLog(TimerInterceptor.java:205) - Executed action [//hello!execute] took 89 ms.
可以看到,由于配置了3個(gè)攔截器,攔截器被順序執(zhí)行。
在執(zhí)行前后分別執(zhí)行了兩個(gè)操作,這就是面向切面編程。
此處可以添加事物鎖,其中鎖可以用redis實(shí)現(xiàn),達(dá)到同時(shí)多個(gè)tomcat實(shí)例讀取數(shù)據(jù)庫(kù)的時(shí)候,進(jìn)行加鎖操作,使用redis達(dá)到鎖的目的。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Mabitis中的#與$符號(hào)區(qū)別及用法介紹
這篇文章主要介紹了Mabitis中的#與$符號(hào)區(qū)別,需要的朋友可以參考下2017-02-02
解決idea中svn提交時(shí)performing vcs refresh時(shí)間很長(zhǎng)的問題
這篇文章主要介紹了解決idea中svn提交時(shí)performing vcs refresh時(shí)間很長(zhǎng)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09
Java OpenCV實(shí)現(xiàn)人臉識(shí)別過程詳解
這篇文章主要介紹了Java OpenCV實(shí)現(xiàn)人臉識(shí)別過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
Java數(shù)據(jù)敏感詞轉(zhuǎn)換成符號(hào)的方法詳解
在某個(gè)論壇下用戶可以隨意留言,為了防止不法分子在網(wǎng)上任意沖浪,需要對(duì)一些敏感詞匯進(jìn)行一些校驗(yàn),所以這篇文章給大家介紹了Java數(shù)據(jù)敏感詞轉(zhuǎn)換成符號(hào)的方法,需要的朋友可以參考下2024-03-03
深入了解Java核心類庫(kù)--Date,Calendar,DateFormat類
這篇文章主要為大家詳細(xì)介紹了javaDate,Calendar,DateFormat類定義與使用的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能給你帶來幫助2021-07-07
Struts2實(shí)現(xiàn)自定義攔截器的三種方式詳解
這篇文章主要介紹了Struts2實(shí)現(xiàn)自定義攔截器的三種方式詳解,一些與系統(tǒng)邏輯相關(guān)的通用功能如權(quán)限的控制和用戶登錄控制等,需要通過自定義攔截器實(shí)現(xiàn),本節(jié)將詳細(xì)講解如何自定義攔截器,需要的朋友可以參考下2023-07-07
Java獲取Class對(duì)象的幾種方式小結(jié)
本文給大家分享了Java獲取Class對(duì)象的幾種方式,使用類名.class 語(yǔ)法,使用對(duì)象的 getClass()方法,使用 Class.forName()方法等多種方法,不同的方式適用于不同的場(chǎng)景,需要的朋友可以參考下2023-10-10
SpringBoot常用數(shù)據(jù)庫(kù)開發(fā)技術(shù)匯總介紹
Spring Boot常用的數(shù)據(jù)庫(kù)開發(fā)技術(shù)有JDBCTemplate、JPA和Mybatis,它們分別具有不同的特點(diǎn)和適用場(chǎng)景,可以根據(jù)具體的需求選擇合適的技術(shù)來進(jìn)行開發(fā)2023-04-04

