SpringBoot攔截器原理解析及使用方法
攔截器簡(jiǎn)介
攔截器通常通過(guò)動(dòng)態(tài)代理的方式來(lái)執(zhí)行。
攔截器的生命周期由IoC容器管理,可以通過(guò)注入等方式來(lái)獲取其他Bean的實(shí)例,使用更方便。
攔截器配置使用方式
實(shí)現(xiàn)攔截器接口:
import java.io.IOException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; private class AuthenticationInterceptor implements HandlerInterceptor { // 在請(qǐng)求處理之前進(jìn)行調(diào)用(Controller方法調(diào)用之前) @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException{ System.out.println(request.getRequestURL()); User user = (User)request.getSession().getAttribute("USER"); if(user != null){ return true; }else { System.out.println("no login..."); // request.getRequestDispatcher("/index.html").forward(request, response); response.sendRedirect(request.getContextPath()+"login.html"); return false; } return false; } // 在請(qǐng)求處理之后視圖被渲染之前進(jìn)行調(diào)用(Controller方法調(diào)用之后) @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) { System.out.println("postHandle..."); } // 在請(qǐng)求結(jié)束之后、也就是視圖被渲染之后進(jìn)行調(diào)用(主要是用于進(jìn)行資源清理工作) @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { System.out.println("afterCompletion..."); } }
將攔截器加入到配置中:
import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebSecurityConfig implements WebMvcConfigurer{ @Override public void addInterceptors(InterceptorRegistry registry){ registry.addInterceptor(new AuthenticationInterceptor()) //所有路徑都被攔截 .addPathPatterns("/**") //添加不攔截的路徑 .excludePathPatterns("/userLogin", "/css/**", "/images/**", "/js/**", "/login.html"); registry.addInterceptor(new OtherInterceptor()) .addPathPatterns("/**"); } }
備注:
由于 preHandle、postHandle、afterCompletion 是不同的方法,如果在這些方法之間使用共享變量來(lái)儲(chǔ)存值,會(huì)存在線程安全問(wèn)題。而使用過(guò)濾器實(shí)現(xiàn)則不存在此問(wèn)題。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JAVA實(shí)現(xiàn)掃描線算法(超詳細(xì))
掃描線算法就是從Ymin開(kāi)始掃描,然后構(gòu)建出NET,之后根據(jù)NET建立AET。接下來(lái)本文通過(guò)代碼給大家介紹JAVA實(shí)現(xiàn)掃描線算法,感興趣的朋友一起看看吧2019-10-10spring?@Transactional注解中常用參數(shù)詳解
這篇文章主要介紹了spring?@Transactional注解中常用參數(shù)詳解,事物注解方式:?@Transactional,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-02-02基于mybatis?plus實(shí)現(xiàn)數(shù)據(jù)源動(dòng)態(tài)添加、刪除、切換,自定義數(shù)據(jù)源的示例代碼
這篇文章主要介紹了基于mybatis?plus實(shí)現(xiàn)數(shù)據(jù)源動(dòng)態(tài)添加、刪除、切換,自定義數(shù)據(jù)源,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03如何將Object類(lèi)轉(zhuǎn)換為實(shí)體類(lèi)
這篇文章主要介紹了如何將Object類(lèi)轉(zhuǎn)換為實(shí)體類(lèi),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08如何利用Retrofit+RxJava實(shí)現(xiàn)網(wǎng)絡(luò)請(qǐng)求的異常處理
這篇文章主要介紹了如何利用Retrofit+RxJava實(shí)現(xiàn)網(wǎng)絡(luò)請(qǐng)求的異常處理,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-04-04