过滤器和拦截器区别区别
过滤器和拦截器的区别 过滤器和拦截器是两个常见的概念在 Java Web 开发中,它们都可以用来对请求进行处理和过滤,但是它们之间有着本质的区别。 从机制上来说,拦截器是基于 Java 的反射机制的,而过滤器是基于函数回调。拦截器可以在 Action 的生命周期中多次被调用,而过滤器只能在容器初始化时被调用一次。 从依赖关系上来说,过滤器依赖于 Servlet 容器,而拦截器不依赖于 Servlet 容器。这意味着,过滤器只能在 Servlet 容器中使用,而拦截器可以在任何环境中使用。 再次,从作用范围上来说,拦截器只能对 Action 请求起作用,而过滤器可以对几乎所有的请求起作用。这意味着,过滤器可以对所有类型的请求进行处理,而拦截器只能对 Action 请求进行处理。 从实现上来说,拦截器可以多次被调用,而过滤器只能被调用一次。这意味着,拦截器可以在不同的时间点上被调用,而过滤器只能在容器初始化时被调用。 下面是一个使用拦截器进行/admin 目录下 JSP 页面的过滤的示例: ```xml <package name="newsDemo" extends="struts-default" namespace="/admin"> <interceptors> <interceptor name="auth" class="com.test.news.util.AccessInterceptor" /> <interceptor-stack name="authStack"> <interceptor-ref name="auth" /> </interceptor-stack> </interceptors> <!-- action --> <action name="newsAdminView!*" class="newsAction" method="{1}"> <interceptor-ref name="authStack"/> </action> </package> ``` 在上面的示例中,我们定义了一个拦截器 AccessInterceptor,并将其添加到 authStack 中。然后,我们在 Action 中引用了这个拦截器栈,来对/admin 目录下 JSP 页面的访问进行过滤。 下面是一个使用过滤器进行/admin 目录下 JSP 页面的过滤的示例: ```xml <filter> <filter-name>access filter</filter-name> <filter-class>com.test.news.util.AccessFilter</filter-class> </filter> ``` 在上面的示例中,我们定义了一个过滤器 AccessFilter,并将其添加到 web.xml 中。然后,我们可以在 web.xml 中配置这个过滤器,以对/admin 目录下 JSP 页面的访问进行过滤。 过滤器和拦截器都是可以用来对请求进行处理和过滤的,但是它们之间有着本质的区别。拦截器可以在 Action 的生命周期中多次被调用,而过滤器只能在容器初始化时被调用一次。同时,拦截器只能对 Action 请求起作用,而过滤器可以对几乎所有的请求起作用。