springboot拦截器
拦截器
基于Java反射机制,不依赖与servlet容器,只能对action请求起作用,可以访问action上下文、值栈里的对象,在action的生命周期中可以多次被调用,可以获取IOC容器中的各个bean
过滤器
基于函数回调,依赖与servlet容器,可以对几乎所有的请求起作用,不能访问action上下文、值栈里的对象,只能在容器初始化时被调用一次,不能获取IOC容器中的各个bean。
springboot中实现拦截器比较简单:
1.创建我们自己的拦截器类并实现 HandlerInterceptor 接口
public class MyInterCeptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
System.out.println("在请求处理之前进行调用(Controller方法调用之前)");
return true;// 只有返回true才会继续向下执行,返回false取消当前请求
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)");
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)");
}
}
2.创建一个Java类继承WebMvcConfigurerAdapter,并重写 addInterceptors 方法。
3.实例化我们自定义的拦截器,然后将对像手动添加到拦截器链中(在addInterceptors方法中添加)。
@Configuration
public class MyWebAppConfigurer extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 多个拦截器组成一个拦截器链,addPathPatterns 用于添加拦截规则,excludePathPatterns 用户排除拦截
registry.addInterceptor(new MyInterCeptor1()).addPathPatterns("/**");
registry.addInterceptor(new MyInterCeptor2()).addPathPatterns("/**");
}
}
执行之后的顺序:
2017-01-17 17:28:15.683 INFO 6460 --- [nio-8088-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization started
2017-01-17 17:28:15.697 INFO 6460 --- [nio-8088-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization completed in 14 ms
MyFilter2执行
MyFilter1执行
MyFilter3执行
11111在请求处理之前进行调用(Controller方法调用之前)
22222在请求处理之前进行调用(Controller方法调用之前)
Session 被创建
22222请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
11111请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
22222在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)
11111在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)
根据输出可以了解拦截器链的执行顺序。
660

被折叠的 条评论
为什么被折叠?



