springboot攔截器不攔截靜態(tài)資源,只攔截controller的實現(xiàn)方法
springboot攔截器不攔截靜態(tài)資源,只攔截controller
攔截器攔截靜態(tài)資源問題
實現(xiàn)攔截器的做法就是實現(xiàn)HandlerInterceptor
然后再WebMvcConfigurer
里配置攔截器
這個時候,一般要手動添加過濾的靜態(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; } ...
實現(xiàn)
加一層抽象類,新增的攔截器繼承該抽象類,并在controllerMethodPreHandle
方法實現(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; } }
登錄攔截器實現(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 的一種實現(xiàn),專門攔截對控制層的請求,主要應(yīng)用于判斷用戶權(quán)限,攔截webSocket請求。
在 Spring Boot 項目中,使用攔截器功能通常需要以下 2 步:
- 1.創(chuàng)建攔截器;
- 2.配置攔截器,指定攔截規(guī)則(如果是攔截所有,靜態(tài)資源也會被攔截)。
第一步:創(chuàng)建攔截器
創(chuàng)建的類實現(xiàn) HandlerInterceptor 接口,即可成為攔截器類
HandlerInterceptor 接口中定義以下 3 個方法,如下表所示。
實例:
/** * 自定義攔截器類 */ public class MyInterceptor implements HandlerInterceptor {// 實現(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í)行順序為 preHandle – Controller 方法 – postHandle – afterCompletion ,所以攔截器實際上可以對 Controller 方法執(zhí)行前后進行攔截監(jiān)控。
第二步:配置攔截器
/** * Web配置類 */ @Configuration public class WebConfig implements WebMvcConfigurer { /** * 添加Web項目的攔截器 */ @Override public void addInterceptors(InterceptorRegistry registry) { // 對所有訪問路徑,都通過MyInterceptor類型的攔截器進行攔截 registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**") .excludePathPatterns("/login", "/index.html", "/user/login", "/css/**", "/images/**", "/js/**", "/fonts/**"); //放行登錄頁,登陸操作,靜態(tài)資源 } }
在指定攔截器攔截規(guī)則時,調(diào)用了兩個方法,這兩個方法的說明如下:
- addPathPatterns:該方法用于指定攔截路徑,例如攔截路徑為“/**”,表示攔截所有請求,包括對靜態(tài)資源的請求。
- excludePathPatterns:該方法用于排除攔截路徑,即指定不需要被攔截器攔截的請求。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
- 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)文章
nacos gateway動態(tài)路由實戰(zhàn)
這篇文章主要介紹了nacos gateway動態(tài)路由實戰(zhàn),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09SpringBoot設(shè)置接口超時的方法小結(jié)
這篇文章主要介紹了SpringBoot設(shè)置接口超時的方法小結(jié),包括配置文件,config配置類及相關(guān)示例代碼,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09Java中過濾器 (Filter) 和 攔截器 (Interceptor)的使用
這篇文章主要介紹了Java中過濾器 (Filter) 和 攔截器 (Interceptor)的使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05Java結(jié)合uniapp實現(xiàn)驗證碼功能的示例詳解
UniApp 是一個基于 Vue.js 的跨平臺應(yīng)用開發(fā)框架,允許開發(fā)者使用統(tǒng)一的代碼庫來構(gòu)建多平臺應(yīng)用,這篇文章將給大家介紹Java結(jié)合uniapp實現(xiàn)驗證碼功能,文中通過詳細的代碼示例講解的非常詳細,需要的朋友可以參考下2024-07-07全網(wǎng)最新springboot整合mybatis-plus的過程
在本文中,介紹了 MyBatis-Plus 的核心功能和使用方法,包括如何配置分頁插件、編寫分頁查詢代碼、使用各種 Wrapper 構(gòu)建復(fù)雜查詢條件等,通過這些內(nèi)容,相信你已經(jīng)對 MyBatis-Plus 有了更深入的了解,并能夠在實際項目中靈活應(yīng)用這些功能,感興趣的朋友跟隨小編一起看看吧2025-02-02Java獲取本機IP地址的方法代碼示例(內(nèi)網(wǎng)、公網(wǎng))
在IT領(lǐng)域獲取本機IP地址是一項基礎(chǔ)但重要的任務(wù),特別是在網(wǎng)絡(luò)編程、遠程協(xié)作和設(shè)備通信中,這篇文章主要給大家介紹了關(guān)于Java獲取本機IP地址的方法(內(nèi)網(wǎng)、公網(wǎng)),需要的朋友可以參考下2024-07-07