过滤器与拦截器都是可以用于拦截用户发起的请求,但是两者在试用的地方有一些区别:
filter
1、过滤器实现的是javax.servlet.Filter接口,而这个接口是在Servlet规范中定义的,也就是说过滤器Filter的使用依赖于Tomcat等容器,导致它只能在web程序中使用;
2、自定义过滤器时,需要实现FIlter接口
1、public void init(FilterConfig filterConfig) throws ServletException
该方法在项目启动的时候会被调用
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException
当有请求发起,会调用该方法,如果希望请求可以继续往下走,需要调用filterChain.doFilter(servletRequest, servletResponse)方法,将请求继续传递下去;
public void destroy()
当服务关闭是,会执行该方法销毁
Interceptor
1、来自于org.springframework.web.servlet,可以处理web请求和非web请求
2、自定义过滤器时,需要实现HandlerInterceptor接口
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
此方法可以根据接口路径,进行判断某些是否需要某些参数,比如token,session等。
如果该方法返回false,则此请求将结束。
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception
当所有的拦截器执行完成,且执行完目标方法后,才会执行此方法
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
渲染完页面后,会调用此方法
3、三个方法的调用方法为
按照顺序调用拦截器的preHandle方法,当执行完目标方法后,再逆序调用postHandle方法,渲染完页面后,再逆序调用后置方法
Filter配置
@Component
public class SelfOneFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("过滤器1---初始化");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("过滤器1---处理中");
}
@Override
public void destroy() {
System.out.println("过滤器1---销毁");
}
}
拦截器配置
public class SelfOneInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截器1---拦截前");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("拦截器1---拦截后");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("拦截器1---拦截完成");
}
}
除此之外,还需要实现WebMvcConfigurer,将拦截器注入到容器中
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Bean
public SelfOneInterceptor selfOneInterceptor() {
return new SelfOneInterceptor();
}
@Bean
public SelfTwoInterceptor selfTwoInterceptor() {
return new SelfTwoInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(selfTwoInterceptor());
registry.addInterceptor(selfOneInterceptor()).addPathPatterns("/**");
}
}