SpringBoot攔截器原理解析及使用方法
攔截器簡(jiǎn)介
攔截器通常通過動(dòng)態(tài)代理的方式來執(zhí)行。
攔截器的生命周期由IoC容器管理,可以通過注入等方式來獲取其他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;@Configurationpublic 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 是不同的方法,如果在這些方法之間使用共享變量來儲(chǔ)存值,會(huì)存在線程安全問題。而使用過濾器實(shí)現(xiàn)則不存在此問題。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. 簡(jiǎn)述JAVA同步、異步、阻塞和非阻塞之間的區(qū)別2. Python TestSuite生成測(cè)試報(bào)告過程解析3. 詳解JAVA 強(qiáng)引用4. IntelliJ IDEA設(shè)置默認(rèn)瀏覽器的方法5. 在JSP中使用formatNumber控制要顯示的小數(shù)位數(shù)方法6. 使用Python3 poplib模塊刪除服務(wù)器多天前的郵件實(shí)現(xiàn)代碼7. IntelliJ IDEA設(shè)置背景圖片的方法步驟8. 解決AJAX返回狀態(tài)200沒有調(diào)用success的問題9. 深入了解JAVA 軟引用10. SpringBoot集成mqtt的多模塊項(xiàng)目配置詳解
