<filter-mapping>元素用于设置一个Filter 所负责拦截的资源。
一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径
<filter-name>子元素用于设置filter的注册名称。该值必须是在
<url-pattern>设置 filter 所拦截的请求路径(过滤器关联的URL样式)
<servlet-name>指定过滤器所拦截的Servlet名称。
<dispatcher>指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。用户可以设置多个<dispatcher> 子元素用来指定 Filter 对资源的多种调用方式进行拦截。
REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。
INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。
上面的配置是“/*”,所有的Web资源都需要途径过滤器
如果想要部分的Web资源进行过滤器过滤则需要指定Web资源的名称即可!
上面已经说过了,过滤器的doFilter()方法是极其重要的,FilterChain接口是代表着所有的Filter,FilterChain中的doFilter()方法决定着是否放行下一个过滤器执行(如果没有过滤器了,就执行目标资源)。
首先在过滤器的doFilter()中输出一句话,并且调用chain对象的doFilter()方法
我们来访问一下test.jsp页面:

我们发现test.jsp(我们的目标资源)成功访问到了,并且在服务器上也打印了字符串!
我们来试试把chain.doFilter(req, resp);这段代码注释了看看!

test.jsp页面并没有任何的输出(也就是说,并没有访问到jsp页面)。
直接看下面的代码。我们已经知道了”准备放行“会被打印在控制台上和test.jsp页面也能被访问得到,但“放行完成“会不会打印在控制台上呢?
答案也非常简单,肯定会打印在控制台上的。我们来看看:


注意,它的完整流程顺序是这样的:客户端发送http请求到Web服务器上,Web服务器执行过滤器,执行到”准备放行“时,就把字符串输出到控制台上,接着执行doFilter()方法,Web服务器发现没有过滤器了,就执行目标资源(也就是test.jsp)。目标资源执行完后,回到过滤器上,继续执行代码,然后输出”放行完成“
我们再多加一个过滤器,看看执行顺序。
过滤器1
过滤器2
Servlet
当我们访问Servlet1的时候,看看控制台会出现什么:

执行顺序是这样的:先执行FilterDemo1,放行,执行FilterDemo2,放行,执行Servlet1,Servlet1执行完回到FilterDemo2上,FilterDemo2执行完毕后,回到FilterDemo1上
注意:过滤器之间的执行顺序看在web.xml文件中mapping的先后顺序的,如果放在前面就先执行,放在后面就后执行!如果是通过注解的方式配置,就比较urlPatterns的字符串优先级
filter的三种典型应用:
1、可以在filter中根据条件决定是否调用chain.doFilter(request, response)方法,即是否让目标资源执行
2、在让目标资源执行之前,可以对request\response作预处理,再让目标资源执行
3、在目标资源执行之后,可以捕获目标资源的执行结果,从而实现一些特殊的功能
没有过滤之前,响应头是这样的:

过滤之后,响应头是这样的:

实体:
集合模拟
开发dao
效果:

我们直接把用户名和密码都放在了Cookie中,这是明文的。懂点编程的人就会知道你的账号了。
于是乎,我们要对密码进行加密!
在过滤器中,加密后的密码就不是中的密码的。所以,我们得在Dao添加一个功能【根据用户名,找到用户】
在过滤器中,比较Cookie带过来的md5密码和在中获得的密码(也经过md5)是否相同
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-67209-2.html
任何工业品都有设计使用寿命
巴菲特哭了