拦截器不依赖与Web容器(Tomcat,JBoss等),可以在非Web项目中使用,以及其他 拦截器SpringMVC提供
Spring-过滤器VS拦截器的区别
| 过滤器&拦截器的区别 |
|---|
| 过滤器基于函数回调实现,拦截器基于反射(动态代理)实现 |
| 使用范围不同,过滤器依赖与Tomcat等web容器,拦截器是Spring的一个组件,由Spring管理,可单独使用 |
| 触发时机不同,过滤器是在进入Tomcat容器之后,Sevlet之前,拦截器是在Servlet之后,Controler之前 |
| 拦截捷的请求范围不同 |
| 拦截器可以获取IOC容器中的各个bean,而过滤器不能 |
拦截器是用什么实现的
拦截器使用动态代理
什么是拦截器
Springboot拦截器实现
- 实现HanderIntercepter接口
public class LoginInterceptor implements HandlerInterceptor {
private Logger logger = LoggerFactory.getLogger(LoginInterceptor.class);
/**
* 该方法在控制器处理请求方法前执行,其返回值表示是否中断后续操作,返回 true 表示继续向下执行,返回 false 表示中断后续操作。
*
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
logger.info("preHandle...........");
return true;
}
/**
* 该方法在控制器处理请求方法调用之后、解析视图之前执行,可以通过此方法对请求域中的模型和视图做进一步修改。
*
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
logger.info("postHandle...........");
}
/**
* 该方法在视图渲染结束后执行,可以通过此方法实现资源清理、记录日志信息等工作。
*
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
logger.info("afterCompletion...........");
}
}
- 实现WebMvcConfigura接口,注册拦截器
@Configuration
public class MyWebMvcConfiguration implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**");
}
}