美文网首页互联网科技程序员
Spring boot学习 (八) 之Interceptor(拦

Spring boot学习 (八) 之Interceptor(拦

作者: xml_ | 来源:发表于2018-11-30 17:28 被阅读8次

前言

上一篇我们介绍了servlet、filter(过滤器)、listener(监听器)spring-boot中的注册,这次学习interceptor(拦截器)的运用。其实interceptor(拦截器)filter(过滤器)很相似,都用于拦截过滤请求,只是filterservlet范畴的,今天我们要学习的是Spring提供的HandlerInterceptor(拦截器),用到了其中比较重要的类:WebMvcConfigurer

正文

拦截器的学习

  • 创建自己的拦截器类并实现 HandlerInterceptor 接口
public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("在请求处理之前进行调用");
        return true;//true才会向下执行 false取消当前请求
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {

        System.out.println("请求处理之后进行调用");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {

        System.out.println("整个请求结束之后被调用");

    }
}

注:从这里也可以看出来拦截器比过滤器更为精细,在request被响应之前、request被响应之后、视图渲染之前以及request全部结束之后都可以进行控制。虽然不能像filter一样修改request的内容,但是可以通过抛出异常(或者返回false)来取消request的执行

  • 创建一个Java类(MyWebMvcConfigurer.java)继承WebMvcConfigurer,并重写 addInterceptors 方法。
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
       
    }
}
  • 实例化我们自定义的拦截器(MyInterceptor ),将对像添加到addInterceptors方法中
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**")
    }
}

执行过滤操作
在请求处理之前进行调用
请求处理之后进行调用
监听器sessiom被创建
整个请求结束之后被调用

总结

只有经过DispatcherServletspring-boot默认为"/*")的请求,才会走拦截器链,我们自定义的Servlet 请求是不会被拦截的,比如我们自定义的Servlet地址 :http://localhost:8080/user/myservlet 是不会被拦截器拦截的,因为他没有经过DispatcherServlet 请求。下面这个是自定义的servlet,他不会走拦截器链

@WebServlet(urlPatterns="/user/*", description="说明")
public class MyServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("》》》》》》doPost方法执行》》》》》》");

    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("》》》》》》doGet方法执行》》》》》》");
        doPost(req, resp);
  }

}

原创作者:梦凌小样
作品链接:https://www.jianshu.com/p/518ad8b10334【原创不易,转载请注明出处,感谢理解】
一位爱生活,爱创作,爱分享,爱自己的90后女程序员一枚,记录工作中的点点滴滴,一起学习,共同进步,期待能和优秀的您交上朋友

相关文章

网友评论

    本文标题:Spring boot学习 (八) 之Interceptor(拦

    本文链接:https://www.haomeiwen.com/subject/zzwhcqtx.html