登录拦截器

在 SpringBoot 开发的项目中,通过实现拦截器来实现用户登录拦截并验证。

所有的用户请求先经过拦截器,由拦截器判断是否放行,再送往Controller层。

SpringBoot 实现登录拦截的原理

  • SpringBoot 通过实现HandlerInterceptor接口实现拦截器,通过实现WebMvcConfigurer接口实现一个配置类,在配置类中注入拦截器,最后再通过 @Configuration 注解注入配置。

  • 实现HandlerInterceptor接口,可以实现 3 个方法:preHandlepostHandleafterCompletion

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    public class UserLoginInterceptor implements HandlerInterceptor {

    /***
    * 在请求处理之前进行调用(Controller方法调用之前)
    */
    @Override
    public boolean preHandle(HttpServletRequest request,
    HttpServletResponse response, Object handler) throws Exception {
    System.out.println("执行了拦截器的preHandle方法");
    try {
    HttpSession session = request.getSession();
    //统一拦截(查询当前session是否存在user)(这里user会在每次登录成功后,写入session)
    User user = (User) session.getAttribute(USER_LOGIN_STATE);
    if (user != null) {
    return true;
    }
    //重定向登录页面
    response.sendRedirect(request.getContextPath() + "/user/login");
    } catch (Exception e) {
    e.printStackTrace();
    }
    return false;
    //如果设置为false时,被请求时,拦截器执行到此处将不会继续操作
    //如果设置为true时,请求将会继续执行后面的操作
    }

    /***
    * 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
    */
    @Override
    public void postHandle(HttpServletRequest request,
    HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    System.out.println("执行了拦截器的postHandle方法");
    }

    /***
    * 整个请求结束之后被调用,也就是在DispatchServlet渲染了对应的视图之后执行(主要用于进行资源清理工作)
    */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
    Object handler, Exception ex) throws Exception {
    System.out.println("执行了拦截器的afterCompletion方法");
    }
    }

    通过这个拦截器,使得 Controller 在执行之前,都需要执行一遍preHandle

  • 实现WebMvcConfigurer接口,注册拦截器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    @Configuration
    public class LoginConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    //注册TestInterceptor拦截器
    InterceptorRegistration registration = registry.addInterceptor(new UserLoginInterceptor());
    //所有路径都被拦截
    registration.addPathPatterns("/**");
    //添加不拦截路径
    registration.excludePathPatterns(
    "/user/login",
    "/user/register",
    "/**/*.html",
    "/**/*.js",
    "/**/*.css"
    );
    }
    }

    将拦截器注册到了拦截器列表中,并且指明了拦截哪些访问路径,不拦截哪些访问路径,不拦截哪些资源文件;最后再以 @Configuration 注解将配置注入。

  • 保持登录状态

    在第一次正确登录之后,就将user保存到session中,再次访问页面的时候,登录拦截器就可以找到这个user对象,就不需要再次拦截到登录界面了。