前言
上一篇我们介绍了servlet、filter(过滤器)、listener(监听器)
在spring-boot
中的注册,这次学习interceptor(拦截器)
的运用。其实interceptor(拦截器)
和filter(过滤器)
很相似,都用于拦截过滤请求,只是filter
是servlet
范畴的,今天我们要学习的是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("/**")
}
}
- 启动程序,浏览器访问:
http://localhost:8080/index
,结合上一遍文章,控制台输出如下信息(过滤器和监听器的学习请移步上一篇文章:Spring boot学习 (七) 之servlet、filter(过滤器)、listener(监听器)的学习):
执行过滤操作
在请求处理之前进行调用
请求处理之后进行调用
监听器sessiom被创建
整个请求结束之后被调用
总结
只有经过DispatcherServlet
(spring-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后女程序员一枚,记录工作中的点点滴滴,一起学习,共同进步,期待能和优秀的您交上朋友
网友评论