首页 > 技术文章 > SpringBoot实践笔记之拦截器配置篇

rickq95 2021-06-15 14:01 原文

SpringBoot实践笔记之拦截器配置篇

应用场景

公司新项目中需要对未登录用户进行访问控制功能

使用依据

对比过滤器和拦截器,最终选择拦截器。
原因1:拦截器采用AOP的方式,对系统中所有的处理器进行前后拦截,而过滤器通过函数回调,主要用于过滤不合法数据。
原因2:市面上大都采用拦截器做登录控制,资料比较成熟。

使用过程

  1. 创建一个拦截器管理器InterceptorConfig实现自WebMvcConfigurer(代理商)
    1. 重写addInterceptors方法
        private static final String[] CUSTOM_RESOURCE_LOCATIONS = new String[]{"/ui/**","/vue/**","/public/**"};
    InterceptorRegistration interceptor = registry.addInterceptor(loginInterceptor);
    	//首先拦截所有
        interceptor.addPathPatterns("/**");
    	//排除登录页面
        interceptor.excludePathPatterns("/user/login");
    	//排除静态资源(这里需要看参考资料,根据项目配置来)
        interceptor.excludePathPatterns(CUSTOM_RESOURCE_LOCATIONS);
    	//排除错误页面(你可以去掉在拦截器里面下断点试试哈哈)
        interceptor.excludePathPatterns("/error");
    
  2. 创建一个拦截器LoginInterceptor实现自HandlerInterceptor(商品)
    1. 重写preHandlepostHandleafterCompletion方法.
     /**
     * 处理请求前(返回true,放行)
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return HandlerInterceptor.super.preHandle(request, response, handler);
    }
    
    /**
     * 处理请求后
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }
    
    /**
     * 响应后执行(DispatcherServlet进行视图的渲染之后)
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
    

3.InterceptorConfigLoginInterceptor添加@Component注入Spring容器.
4.测试代码

参考资料

1.springboot拦截器的拦截与不拦截
https://www.cnblogs.com/cnsdhzzl/p/10931823.html
2.SpringBoot2 如何使得拦截器排除静态资源的请求
https://blog.csdn.net/java_pet/article/details/84785803

推荐阅读