0
点赞
收藏
分享

微信扫一扫

HandlerInterceptor拦截器实际应用

一枚路过的程序猿 2022-04-21 阅读 48
java

Springboot项目里的拦截器

前后端分离项目中的拦截器HandlerInterceptor

  • 创建一个自定义拦截器,实现HandlerInterceptor接口 或者继承HandlerInterceptorAdapter
  • 重写preHandle和postHandle方法,并在方法中写拦截的逻辑
  • 如有多个拦截器,写个配置类,实现WebMvcConfigurer,重写addInterceptors方法,把自定义的拦截器放进去,还可以指定每个拦截器的顺序什么的,这样就做好了自定义的一批拦截器(见第二部分代码)
  • 假设有一些请求的白名单路径,需要在项目启动的时候就加载,可以让拦截器同时实现InitializingBean接口,重写afterPropertiesSet方法即可
public class WebInterceptor implements HandlerInterceptor {

    /**
     * 在业务处理器处理请求之前被调用。预处理,可以进行一些权限的校验、白名单、是否登录之类的动作
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //获取请求头session,看看是否登录
        //系统是否可用的配置
        //白名单之类的
        //权限啥的也行
        //反正就是正式逻辑处理前的动作,都能放拦截器里做
        return true;
    }

    /**
     * 在业务处理器处理请求执行完成后,生成视图之前执行。
     * 后处理(调用了Service并返回ModelAndView,但未进行页面渲染)
     * 一般前后端分离的项目不关注这个,倒是清除session,可以放在这里做
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }
    /**
     * 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等。返回处理
     * 没见有用过
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}
@Configuration
public class WebInterceptorConfig implements WebMvcConfigurer {

    @Autowired
    private WebSessionInterceptor webSessionInterceptor;

    @Autowired
    private WebPreCheckInterceptor webPreCheckInterceptor;

    @Autowired
    private WebOfflineInterceptor webOfflineInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(webSessionInterceptor).order(0).addPathPatterns("/**");
        registry.addInterceptor(webPreCheckInterceptor).order(1).addPathPatterns("/**");
        registry.addInterceptor(webOfflineInterceptor).order(2).addPathPatterns("/**");
        WebMvcConfigurer.super.addInterceptors(registry);
    }
}
举报

相关推荐

0 条评论