快速入门
写一个简单的过滤器
- 实现Filter接口的Java类就被称作为过滤器
public class FilterDemo1 implements Filter { public void destroy() { } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { //执行这一句,说明放行(让下一个过滤器执行,如果没有过滤器了,就执行执行目标资源) chain.doFilter(req, resp); } public void init(FilterConfig config) throws ServletException { } }
filter部署
过滤器和Servlet是一样的,需要部署到Web服务器上的。
第一种方式:在web.xml文件中配置
filter
<filter>
用于注册过滤器
<filter> <filter-name>FilterDemo1</filter-name> <filter-class>FilterDemo1</filter-class> <init-param> <param-name>word_file</param-name> <param-value>/WEB-INF/word.txt</param-value> </init-param> </filter>
<filter-name>
用于为过滤器指定一个名字,该元素的内容不能为空。<filter-class>
元素用于指定过滤器的完整的限定类名。<init-param>
元素用于为过滤器指定初始化参数,它的子元素
指定参数的名字,<param-value>
指定参数的值。在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。
filter-mapping
<filter-mapping>
元素用于设置一个Filter 所负责拦截的资源。
一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径
<filter-mapping> <filter-name>FilterDemo1</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
<filter-name>
子元素用于设置filter的注册名称。该值必须是在
元素中声明过的过滤器的名字<url-pattern>
设置 filter 所拦截的请求路径(过滤器关联的URL样式)<servlet-name>
指定过滤器所拦截的Servlet名称。<dispatcher>
指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。用户可以设置多个<dispatcher>
子元素用来指定 Filter 对资源的多种调用方式进行拦截。
dispatcher
子元素可以设置的值及其意义:
- REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。
- INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
- FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
- ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。
第二种方式:通过注解配置
@WebFilter(filterName = "FilterDemo1",urlPatterns = "/*")
上面的配置是“/*”,所有的Web资源都需要途径过滤器
如果想要部分的Web资源进行过滤器过滤则需要指定Web资源的名称即可!
过滤器的执行顺序
上面已经说过了,过滤器的doFilter()方法是极其重要的,FilterChain接口是代表着所有的Filter,FilterChain中的doFilter()方法决定着是否放行下一个过滤器执行(如果没有过滤器了,就执行目标资源)。
测试一
- 首先在过滤器的doFilter()中输出一句话,并且调用chain对象的doFilter()方法
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { System.out.println("我是过滤器1"); //执行这一句,说明放行(让下一个过滤器执行,或者执行目标资源) chain.doFilter(req, resp); }
我们来访问一下test.jsp页面:
我们发现test.jsp(我们的目标资源)成功访问到了,并且在服务器上也打印了字符串!
测试二
我们来试试把chain.doFilter(req, resp);
这段代码注释了看看!
test.jsp页面并没有任何的输出(也就是说,并没有访问到jsp页面)。