过滤器和拦截器的区别

一、实现方式

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架构的项目中,优先使用拦截器。

你可能感兴趣的:(过滤器和拦截器的区别)