Spring攔截器實(shí)現(xiàn)鑒權(quán)的示例代碼
什么是攔截器?
攔截器(Interceptor)類(lèi)似于Servlet中的過(guò)濾器,主要用于攔截用戶(hù)請(qǐng)求并做出相應(yīng)的處理,例如攔截器可以進(jìn)行權(quán)限驗(yàn)證、記錄請(qǐng)求信息的日志、判斷用戶(hù)是否登錄等。攔截器允許自定義預(yù)處理(Pre-Processing),在其中可以選擇禁止對(duì)應(yīng)Handler 的執(zhí)行;也允許自定義后處理(Post-Precessing);?
怎樣實(shí)現(xiàn)Spring攔截器?
實(shí)現(xiàn)Spring攔截器很簡(jiǎn)單,只需要實(shí)現(xiàn)HandlerInterceptor接口即可。HandlerInterceptor這個(gè)接口中有三個(gè)核心方法:
1.preHandle方法:在HandlerMapping確定Handler對(duì)象之后,但在HandlerAdapter調(diào)用handler之前執(zhí)行(就是在調(diào)用controller之前執(zhí)行該方法)。該方法返回一個(gè)布爾值,只有true的時(shí)候才繼續(xù)執(zhí)行對(duì)應(yīng)的handler,否則不再執(zhí)行對(duì)應(yīng)的handler了。
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return true;
}2.postHandle方法:在 HandlerAdapter 實(shí)際調(diào)用處理程序之后,但在 DispatcherServlet 呈現(xiàn)視圖之前調(diào)用(就是在響應(yīng)返回客戶(hù)端之前執(zhí)行)。
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {}3.afterCompletion方法:請(qǐng)求處理完成后回調(diào),即渲染視圖后。將在處理程序執(zhí)行的任何結(jié)果上被調(diào)用,從而允許適當(dāng)?shù)馁Y源清理。注意:只有當(dāng)這個(gè)攔截器的 preHandle 方法成功完成并返回 true 時(shí)才會(huì)被調(diào)用!與 postHandle 方法一樣,該方法將以相反的順序在鏈中的每個(gè)攔截器上調(diào)用,因此第一個(gè)攔截器將是最后一個(gè)被調(diào)用的。
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {}
}關(guān)于上述三個(gè)核心方法調(diào)用的順序,在此我們假設(shè)有是三個(gè)攔截器,Interceptor1 、Interceptor2、和Interceptor3。在定義三個(gè)攔截器的時(shí)候我們就是按照這個(gè)順序定義的,而攔截器的執(zhí)行順序就是按照之前定義的順序執(zhí)行。
Interceptor1的preHandle方法 -> Interceptor2的preHandle方法 -> Interceptor3的preHandle方法 -> controller ->Interceptor3 的postHandle方法 -> Interceptor2 的postHandle方法 -> Interceptor1 的postHandle方法 -> Interceptor3 的afterCompletion方法 -> Interceptor2 的afterCompletion方法 ->Interceptor1 的afterCompletion方法。如圖:

如何使用Spring攔截器鑒權(quán)?
通過(guò)上述對(duì)三個(gè)核心方法的解釋可知,如果我們想通過(guò)攔截器實(shí)現(xiàn)鑒權(quán),那么只需要實(shí)現(xiàn)接口后,在preHandle方法中做相應(yīng)的處理即可。如下:
public class SecurityInterceptor implements HandlerInterceptor {
@Autowired
private JddPmsHelper jddPmsHelper;
@Value("${global.authTest}")
private String authTest;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//測(cè)試環(huán)境不校驗(yàn)權(quán)限,需預(yù)發(fā)驗(yàn)證
if ("true".equals(authTest)) {
return true;
}
String uri = request.getRequestURI();
if (uri.contains("static")) {
return true;
}
String pin = ServletUtils.getCommonPin();
if (StringUtils.isBlank(pin)) {
throw new NoLoginException("未登陸");
}
if (uri.equals("/")) {
return true;
}
boolean checkResult = jddPmsHelper.authCheckUrl(pin, uri);
if (!checkResult) {
throw new NoneSecurityException("您沒(méi)有權(quán)限訪(fǎng)問(wèn),請(qǐng)聯(lián)系管理員,對(duì)您的erp賬號(hào)進(jìn)行配置");
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}在實(shí)現(xiàn)HandlerInterceptor接口之后,可以通過(guò)
1、攔截器注冊(cè):實(shí)現(xiàn)WebMvcConfigurer的addInterceptors注冊(cè)。
/**
* 攔截器注冊(cè) WebConfig
*
*/
@Configuration
@Slf4j
public class WebConfig implements WebMvcConfigurer {
/**
* 登錄/權(quán)限攔截器
*/
@Resource
private CombinedLoginInterceptor combinedLoginInterceptor;
/**
* 控制層切面處理
* ControllerExceptionHandler
*/
@Resource
private ControllerExceptionResolver controllerExceptionResolver;
/**
*
*/
private static final String MATCH_ALL = "/**";
/**
* 免驗(yàn)證
*/
private static final String APP_EXCLUDE = "/common/info";
/**
* 異常頁(yè)
*/
private static final String ERROR_URL = "/error";
/**
* 無(wú)需權(quán)限驗(yàn)證的URI集合
*/
private static final String[] PC_WHITE_LIST = {APP_EXCLUDE, ERROR_URL};
@Override
public void addInterceptors(InterceptorRegistry registry) {
//PC端登錄攔截,必須添加
registry.addInterceptor(combinedLoginInterceptor).addPathPatterns(MATCH_ALL).excludePathPatterns(PC_WHITE_LIST).order(1);
}
@Override
public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
resolvers.add(controllerExceptionResolver);
}
}2、通過(guò)XML文件注冊(cè)
<!-- 單點(diǎn)登錄攔截器配置-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.xxx.intercepter.SecurityInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>除了使用攔截器鑒權(quán),還可以有哪幾種方式?
1、傳統(tǒng)AOP方式:在Controller方法前添加切點(diǎn),然后再對(duì)切點(diǎn)進(jìn)行處理即可。
2、過(guò)濾器:其實(shí)現(xiàn)相對(duì)簡(jiǎn)單,只需要實(shí)現(xiàn)Filter接口即可。
詳細(xì)實(shí)現(xiàn)可以參考這篇文章: SpringBoot 項(xiàng)目鑒權(quán)的 4 種方式
到此這篇關(guān)于Spring攔截器實(shí)現(xiàn)鑒權(quán)的示例代碼的文章就介紹到這了,更多相關(guān)Spring攔截器鑒權(quán)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中不用第三個(gè)變量來(lái)互換兩個(gè)變量的值
在程序運(yùn)行期間,隨時(shí)可能產(chǎn)生一些臨時(shí)數(shù)據(jù),應(yīng)用程序會(huì)將這些數(shù)據(jù)保存在一些內(nèi)存單元中,每個(gè)內(nèi)存單元都用一個(gè)標(biāo)識(shí)符來(lái)標(biāo)識(shí)。這些內(nèi)存單元被稱(chēng)為變量,定義的標(biāo)識(shí)符就是變量名,內(nèi)存單元中存儲(chǔ)的數(shù)據(jù)就是變量的值2021-10-10
Java源碼解析CopyOnWriteArrayList的講解
今天小編就為大家分享一篇關(guān)于Java源碼解析CopyOnWriteArrayList的講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01
淺析java volatitle 多線(xiàn)程問(wèn)題
Volatile修飾的成員變量在每次被線(xiàn)程訪(fǎng)問(wèn)時(shí),都強(qiáng)迫從共享內(nèi)存中重讀該成員變量的值。而且,當(dāng)成員變量發(fā)生變化時(shí),強(qiáng)迫線(xiàn)程將變化值回寫(xiě)到共享內(nèi)存2013-08-08
java和c/c++ 數(shù)據(jù)類(lèi)型長(zhǎng)度的比較
本篇文章主要是對(duì)java和c/c++ 數(shù)據(jù)類(lèi)型長(zhǎng)度的進(jìn)行了詳細(xì)的比較。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2014-01-01
Java service層獲取HttpServletRequest工具類(lèi)的方法
今天小編就為大家分享一篇關(guān)于Java service層獲取HttpServletRequest工具類(lèi)的方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12
Spring調(diào)度框架EnableScheduling&Scheduled源碼解析
這篇文章主要介紹了Spring調(diào)度框架EnableScheduling&Scheduled源碼解析,@EnableScheduling&Scheduled定時(shí)調(diào)度框架,本著不僅知其然還要知其所以然的指導(dǎo)思想,下面對(duì)該調(diào)度框架進(jìn)行源碼解析,以便更好的理解其執(zhí)行過(guò)程,需要的朋友可以參考下2024-01-01
SpringBoot中web模板渲染的實(shí)現(xiàn)
本文主要介紹了SpringBoot中web模板渲染的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
jdk環(huán)境變量配置切換jdk版本及安裝jdk后環(huán)境變量不生效問(wèn)題解決辦法
這篇文章主要介紹了jdk環(huán)境變量配置切換jdk版本及安裝jdk后環(huán)境變量不生效問(wèn)題解決辦法,包括配置JAVA_HOME、Path和CLASSPATH,以及如何驗(yàn)證配置是否成功,文章還講解了如何切換JDK版本,并解決了安裝新JDK后環(huán)境變量配置不生效的問(wèn)題,需要的朋友可以參考下2024-12-12
Java執(zhí)行cmd命令兩種實(shí)現(xiàn)方法解析
這篇文章主要介紹了Java執(zhí)行cmd命令兩種實(shí)現(xiàn)方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07

