昨天晚上做梦,梦见面试官问我过滤器和拦截器的区别。。。
过滤器和拦截器的区别:
1、过滤器和拦截器触发时机不一样,过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。
请求结束返回也是,是在servlet处理完后,返回给前端之前。
2、拦截器可以获取IOC容器中的各个bean,而过滤器就不行,因为拦截器是spring提供并管理的,
spring的功能可以被拦截器使用,在拦截器里注入一个service,可以调用业务逻辑。
而过滤器是JavaEE标准,只需依赖servlet api ,不需要依赖spring。
3、过滤器的实现基于回调函数。而拦截器(代理模式)的实现基于反射,代理分静态代理和动态代理,
动态代理是拦截器的简单实现。
何时使用拦截器?何时使用过滤器?
如果是非spring项目,那么拦截器不能用,只能使用过滤器。
如果是处理controller前后,既可以使用拦截器也可以使用过滤器。
如果是处理dispaterServlet前后,只能使用过滤器。
过滤器注解实现:
import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; /** * @author maxixnhai * @PackageName www.maxinhai.com.diary.common.filter * @ClassName AuthFilter * @Description * @date 2020/4/5 17:41 */ @WebFilter(urlPatterns = "/*", filterName = "authFilter") public class AuthFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { long start = System.currentTimeMillis(); Object name = request.getParameter("name"); System.out.println("name => " + name); for(int i=0; i<10000; i++) { //System.out.println("过滤器打印: " + i); } long end = System.currentTimeMillis(); System.out.println("authFilter 耗时: " + (end - start)); } @Override public void destroy() { } }
注解实现需要在启动器(本文为SpringBoot) 添加 @ServletComponentScan("www.maxinhai.com.diary.common") 扫描过滤器。
非注解实现的话,需要在web.xml添加如下配置:
<!-- 配置登陆过滤器 --> <filter> <filter-name>authFilter</filter-name> <filter-class>www.maxinhai.com.filter.AuthFilter</filter-class> <init-param> <param-name>passUrl</param-name> <param-value>index;FunctionServlet</param-value> </init-param> </filter> <filter-mapping> <filter-name>loginFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
原文地址:https://www.cnblogs.com/mxh-java/p/12638455.html
时间: 2024-10-08 01:50:18