最近在努力學習spring boot中,這裡記錄一下攔截器的相關知識,在spring boot中,寫一個自定義的攔截器類,用于攔截不通過登入之後而進行的非法通路,攔截的操作,也是日常項目中,都要用到的,不多說了,看正文。
要實作一個自定義登入的攔截器,這個類要實作HandlerInterceptor接口,HandlerInterceptor接口源碼如下:
public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
}
在JDK1.8中,該接口的方法前面有一個default進行修飾,表明實作該接口的類,可以隻實作自己想要實作的方法,其他的方法,繼承父類,從源碼中也可以看到,用default修飾的方法,有方法體,關于default的更多知識,本篇不做過多說明。
自己的類實作這個接口,重寫接口的preHandle方法即可,在方法體中,寫自己的業務邏輯,我這裡是做登入的攔截器,方法體的代碼如下所示:
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Object name = request.getSession().getAttribute("name");
if(name == null){
request.setAttribute("msg","請先登入");
request.getRequestDispatcher("/index.html").forward(request,response);
return false;
}
return true;
}
在寫完自定義的攔截器後,接着,就是要将其放入spring boot容器中,以及對哪些請求進行放行。在自定義的MvcConfig類中,重寫addInterceptors方法,我的具體代碼如下所示:
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**")
.excludePathPatterns("/","/index.html","/login","/login.html",
"/user/login","/static/**","/webjars/**");
//excludePathPatterns方法的參數 為要放行的請求
}
addPathPatterns為要攔截的,excludePathPatterns為要放行的。