天天看點

spring boot 自定義登入攔截器

        最近在努力學習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為要放行的。

繼續閱讀