相同点:
拦截器与过滤器都是基于Aop技术,对方法实现增强,都可以拦截请求方法。
不同点:
- 过滤器属于Servlet自己研发的,而拦截器技术属于SpringMVC自己研发的。
- 过滤器属于拦截Web请求,而拦截器不仅可以拦截请求还可以拦截普通方法。
- 过滤器会比拦截器先执行,拦截器封装的方法比过滤器拦截使用起来更加简单。
拦截器应用场景:权限控制、日志打印、参数验证 、会话。
过滤器应用场景:编码转换、跨域解决、xss攻击
实现:
过滤器继承Filter类,加注解@WebFilter(“/*”),需要把自定义拦截器添加到容器中
@Slf4j @WebFilter("/share/*") public class MyFittiler implements Filter { public void init(FilterConfig filterConfig) throws ServletException { log.info(" init {}",filterConfig.getFilterName()); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { log.info(" doFilter 我拦截到了请求"); chain.doFilter(request,response);//到下一个链 } public void destroy() { log.info(" destroy 我拦截到了请求"); } }
/** */ public class WebInitializer implements WebApplicationInitializer { public void onStartup( ServletContext servletContext) throws ServletException { servletContext.addFilter("myFittiler",new MyFittiler()); } }
拦截器:实现HandlerInterceptor接口,并在WebMvcConfigurer中创建bean,然后手动注入拦截器
public class MyInterceptor implements HandlerInterceptor { /** * 请求方法前置拦截,如果返回true 表示会执行到目标方法(请求方法) 如果返回false的情况下 则不会执行目标方法。 */ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { return true; } /** * @param request * @param response * @param handler * @param modelAndView * @throws Exception */ public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("<<<postHandle>>>>"); } /** * @param request * @param response * @param handler * @param ex * @throws Exception */ public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println(">>>afterCompletion<<<"); } }
@Configuration @ComponentScan("com.controller") @EnableWebMvc public class SpringMvcConfig implements WebMvcConfigurer { @Bean public MyInterceptor myInterceptor() { return new MyInterceptor(); } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(myInterceptor()).addPathPatterns("/**");// 拦截所有的请求 } }