一、实现方式
1、Filter
实现javax.servlet.Filter接口,然后在web.xml中进行相关配置。
public interface Filter {
//容器初始化时调用一次
void init(FilterConfig var1) throws ServletException;
void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;
//容器销毁时调用一次
void destroy();
}
2、Interceptor
实现org.springframework.web.servlet.HandlerInterceptor接口,然后在spring中进行相关配置。
public interface HandlerInterceptor {
// 在业务处理器处理请求之前被调用
boolean preHandle(HttpServletRequest var1, HttpServletResponse var2, Object var3) throws Exception;
//在业务处理器处理请求之后被调用
void postHandle(HttpServletRequest var1, HttpServletResponse var2, Object var3, ModelAndView var4) throws Exception;
//在DispatcherServlet完全处理完请求后被调用
void afterCompletion(HttpServletRequest var1, HttpServletResponse var2, Object var3, Exception var4) throws Exception;
}
二、两者区别
1、范围不同
Filter位于 javax.servlet 包下,而拦截器(HandlerInterceptor)是 org.springframework.web.servle 包下的。所以Filter只能用于web程序中,而拦截器只要能适用spring就可以适用;
2、实现不同
Filter基于函数回调,filterChain.doFilter(request, response)继续调用。而拦截器返回Boolean,基于Java的反射机制,属于面向切面编程(AOP)的一种运用,就是在service或者一个方法前,调用一个方法,或者在方法后,调用一个方法,
比如动态代理就是拦截器的简单实现。
3、使用资源不同
拦截器是spring的一个组件,归spring管理,配置在spring文件里,因此能使用spring里的任何资源、对象,通过IOC注入到拦截器即可。而过滤器基于servlet容器,一般都在web.xml里配置;
4、使用深度不同
基于Filter接口,过滤器只在Servlet前后起作用。而拦截器可以深入到方法前后、异常抛出前后等,使用范围更广。所以在spring架构的项目中,优先使用拦截器。