拦截器类似与Servlet中的过滤器,主要用于拦截客户请求并作出相应的处理,与过滤器有如下区别:
过滤器只能在容器初始化时被调用一次;在action的生命周期中,拦截器可以被调用多次;
过滤器几乎可以对所有的请求起作用,拦截器只能对action起作用;
过滤器不能访问action上下文,值栈里的对象,而拦截器可以;
过滤器依赖于servlet容器,而拦截器不依赖servlet容器;
过滤器是基于函数回调的,而拦截器是基于Java反射机制;
过滤器不能获取IOC容器中的各个bean,而拦截器可以,在拦截器里注入一个service,可以调用业务逻辑
拦截器特点:
请求到达经过拦截器,相应回来也经过拦截器
只能拦截控制器相关请求,不能拦截JSP请求
拦截器可以中断用户的请求轨迹
拦截器的作用:
将多个控制器中共有的代码放入拦截器可以减少控制器代码的冗余
@Component
public class InterceptorDemo implements HandlerInterceptor {
//请求之前执行
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler) throws Exception
{
System.out.println("请求之前执行");
return true;
}
//请求之后执行
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception{
System.out.println("请求之后执行");
}
//响应之后执行
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception{
System.out.println("响应之后执行");
}
}
@Configuration
public class InterceporConfig implements WebMvcConfigurer {
@Autowired
private InterceptorDemo interceptorDemo;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(interceptorDemo)
.addPathPatterns("/test/login")//拦截的路径
.excludePathPatterns("/test/visit");//不拦截的路径
}
}
@RestController
@RequestMapping("/test")
public class TestController {
@GetMapping("login")
public void login(){
System.out.println("被拦截的路径---login---");
}
@GetMapping("visit")
public void visit(){
System.out.println("不拦截的路径---visit---");
}
}