springboot攔截器不攔截靜態(tài)資源,只攔截controller的實(shí)現(xiàn)方法
springboot攔截器不攔截靜態(tài)資源,只攔截controller
攔截器攔截靜態(tài)資源問題
實(shí)現(xiàn)攔截器的做法就是實(shí)現(xiàn)HandlerInterceptor然后再WebMvcConfigurer里配置攔截器
這個(gè)時(shí)候,一般要手動添加過濾的靜態(tài)資源路徑,如果靜態(tài)資源路徑修改,則攔截器要修改
如果有添加其他攔截/**的攔截器,也需要配置靜過濾態(tài)資源路徑
@Configuration
public class WebConfigurer implements WebMvcConfigurer {
@Autowired
private LoginInterceptor loginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
String []strs = {"/static/**","/project/**","/assets/**","/login","/login.do"};
registry.addInterceptor(loginInterceptor).excludePathPatterns(strs);
}
}只攔截controller方法
利用HandlerInterceptor 接口的handler
如果是controller的方法,handler為 HandlerMethod
如果是資源類,handler為 org.springframework.web.servlet.resource.ResourceHttpRequestHandler
public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
...實(shí)現(xiàn)
加一層抽象類,新增的攔截器繼承該抽象類,并在controllerMethodPreHandle方法實(shí)現(xiàn)業(yè)務(wù)功能,即可忽視靜態(tài)資源類
public abstract class AbstrctControllerInterceptor implements HandlerInterceptor {
protected abstract boolean controllerMethodPreHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException;
@Override
public final boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//如果是controller的方法handler為HandlerMethod
//如果是資源類則handler為org.springframework.web.servlet.resource.ResourceHttpRequestHandler
if(handler instanceof HandlerMethod){
return controllerMethodPreHandle(request,response,handler);
}
//否則不攔截
return true;
}
}登錄攔截器實(shí)現(xiàn)
@Component
public class LoginInterceptor extends AbstrctControllerInterceptor {
@Override
protected boolean controllerMethodPreHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
Object user = request.getSession().getAttribute(ConstantValue.USER_CONTEXT_KEY);
if(user == null){
response.sendRedirect("/login");
return false;
}
return true;
}
}對比之前的配置,可以忽視資源路徑了
@Configuration
public class WebConfigurer implements WebMvcConfigurer {
@Autowired
private LoginInterceptor loginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
// String []strs = {"/static/**","/project/**","/assets/**","/login","/login.do"};
String []strs = {"/login","/login.do"};
registry.addInterceptor(loginInterceptor).excludePathPatterns(strs);
}
}springboot攔截器問題
Spring Boot 攔截器是 AOP 的一種實(shí)現(xiàn),專門攔截對控制層的請求,主要應(yīng)用于判斷用戶權(quán)限,攔截webSocket請求。
在 Spring Boot 項(xiàng)目中,使用攔截器功能通常需要以下 2 步:
- 1.創(chuàng)建攔截器;
- 2.配置攔截器,指定攔截規(guī)則(如果是攔截所有,靜態(tài)資源也會被攔截)。
第一步:創(chuàng)建攔截器
創(chuàng)建的類實(shí)現(xiàn) HandlerInterceptor 接口,即可成為攔截器類
HandlerInterceptor 接口中定義以下 3 個(gè)方法,如下表所示。

實(shí)例:
/**
* 自定義攔截器類
*/
public class MyInterceptor implements HandlerInterceptor {// 實(shí)現(xiàn)HandlerInterceptor接口
/**
* 訪問控制器方法前執(zhí)行
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println(new Date() + "--preHandle:" + request.getRequestURL());
return true;
}
/**
* 訪問控制器方法后執(zhí)行
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println(new Date() + "--postHandle:" + request.getRequestURL());
}
/**
* postHandle方法執(zhí)行完成后執(zhí)行,一般用于釋放資源
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println(new Date() + "--afterCompletion:" + request.getRequestURL());
}
}注意:MyInterceptor 中的方法執(zhí)行順序?yàn)?preHandle – Controller 方法 – postHandle – afterCompletion ,所以攔截器實(shí)際上可以對 Controller 方法執(zhí)行前后進(jìn)行攔截監(jiān)控。
第二步:配置攔截器
/**
* Web配置類
*/
@Configuration
public class WebConfig implements WebMvcConfigurer {
/**
* 添加Web項(xiàng)目的攔截器
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 對所有訪問路徑,都通過MyInterceptor類型的攔截器進(jìn)行攔截
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**")
.excludePathPatterns("/login", "/index.html", "/user/login", "/css/**", "/images/**", "/js/**", "/fonts/**");
//放行登錄頁,登陸操作,靜態(tài)資源
}
}在指定攔截器攔截規(guī)則時(shí),調(diào)用了兩個(gè)方法,這兩個(gè)方法的說明如下:
- addPathPatterns:該方法用于指定攔截路徑,例如攔截路徑為“/**”,表示攔截所有請求,包括對靜態(tài)資源的請求。
- excludePathPatterns:該方法用于排除攔截路徑,即指定不需要被攔截器攔截的請求。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- springboot設(shè)置加載靜態(tài)資源的路徑(spring.resources.static-locations)
- SpringBoot中的static靜態(tài)資源訪問、參數(shù)配置、代碼自定義訪問規(guī)則詳解
- 關(guān)于SpringBoot攔截器攔截靜態(tài)資源的問題
- springboot應(yīng)用中靜態(tài)資源訪問與接口請求沖突問題解決
- SpringBoot2.x過后static下的靜態(tài)資源無法訪問的問題
- SpringBoot如何訪問html和js等靜態(tài)資源配置
- springboot+thymeleaf打包成jar后找不到靜態(tài)資源的坑及解決
- SpringBoot無法訪問/static下靜態(tài)資源的解決
- SpringBoot靜態(tài)資源及原理解析
相關(guān)文章
詳解SpringBoot如何實(shí)現(xiàn)統(tǒng)一后端返回格式
在前后端分離的項(xiàng)目中后端返回的格式一定要友好,不然會對前端的開發(fā)人員帶來很多的工作量。那么SpringBoot如何做到統(tǒng)一的后端返回格式呢?本文將為大家詳細(xì)講講2022-04-04
Java實(shí)現(xiàn)的數(shù)字簽名算法RSA完整示例
這篇文章主要介紹了Java實(shí)現(xiàn)的數(shù)字簽名算法RSA,結(jié)合完整實(shí)例形式詳細(xì)分析了RSA算法的相關(guān)概念、原理、實(shí)現(xiàn)方法及操作技巧,需要的朋友可以參考下2019-09-09
詳解Java利用ExecutorService實(shí)現(xiàn)同步執(zhí)行大量線程
這篇文章主要介紹了Java利用ExecutorService實(shí)現(xiàn)同步執(zhí)行大量線程,ExecutorService可以維護(hù)我們的大量線程在操作臨界資源時(shí)的穩(wěn)定性。2017-03-03
Spark MLlib隨機(jī)梯度下降法概述與實(shí)例
這篇文章主要為大家詳細(xì)介紹了Spark MLlib隨機(jī)梯度下降法概述與實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08
整理Java的MyBatis框架中一些重要的功能及基本使用示例
這篇文章主要介紹了Java的MyBatis框架中一些重要的功能及基本使用示例整理,MyBatis可以幫助Java程序進(jìn)行強(qiáng)大的數(shù)據(jù)庫操作,需要的朋友可以參考下2016-04-04
springtask 的使用方法和 cron 表達(dá)式解析
這篇文章主要介紹了springtask 的使用方法和 cron 表達(dá)式解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
Java?IO及BufferedReader.readline()出現(xiàn)的Bug
這篇文章主要介紹了Java?IO及BufferedReader.readline()出現(xiàn)的Bug,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12

