过滤器
什么是过滤器
过滤器是Servlet的高级特性之一,实现的是Filter接口的Java类
首先我们应该清楚过滤器所处的位置,即过滤器作用的位置,可以简单看一下下图:
通过此图可以看出,当浏览器发送请求给服务器的时候,先执行过滤器,然后才访问Web的资源。服务器响应Response,从Web资源抵达浏览器之前,也会途径过滤器。
简单理解,就可以把过滤器看成一张滤网,只有符合过滤条件才能通过过滤器到达下一步需要执行的步骤。
这就不难理解为什么我们有时的某些访问请求会被拒绝——当需要限制用户访问某些资源时、在处理请求时提前处理某些资源、服务器响应的内容对其进行处理再返回、我们就是用过滤器来完成的!
过滤器的作用
过滤器是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器对请求进行修改、判断等,把不符合规则的请求在中途拦截或修改。也可以对响应进行过滤,拦截或修改响应。
浏览器发出的请求先递交给第一个filter进行过滤,符合规则则放行,递交给filter链中的下一个过滤器进行过滤。过滤器在链中的顺序与它在web.xml中配置的顺序有关,配置在前的则位于链的前端。当请求通过了链中所有过滤器后就可以访问资源文件了,如果不能通过,则可能在中间某个过滤器中被处理掉。
过滤器一般用于登录权限验证、资源访问权限控制、敏感词汇过滤、字符编码转换等等操作,便于代码重用,不必每个servlet中还要进行相应的操作。
例:字符编码转换
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
这是在Servlet里面设置字符编码的代码,但是通常情况下Servlet不止一个,所以我们需要在每一个Servlet中都写上上面的代码,这样的话,不仅麻烦,而且容易搞混淆。
所以我们对于这类多个Servlet中会执行相同的代码的时候,我们通常可以使用过滤器来帮我们完成操作。
过滤器的用法
如果想要使用过滤器,首先需要实现Filter类,并重写三个需要的方法:
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter(filterName = "TestFilter2",urlPatterns = "/*")
public class TestFilter2 implements Filter {
public void init(FilterConfig config) throws ServletException {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
chain.doFilter(req, resp);
}
public void destroy() {
}
}
init方法: 容器在创建当前过滤器的时候自动调用;
destroy方法: 容器在销毁当前过滤器的时候自动调用
doFilter方法: 过滤器的主要代码写在这个地方
在doFilter()方法中,chain.doFilter()前的一般是对request执行的过滤操作,chain.doFilter后面的代码一般是对response执行的操作。过滤链代码的执行顺序如下:
如果有多个过滤器时,根据在在web.xml文件里中中写的过滤器顺序执行。
注意:如果既有在web.xml中声明的Filter,也有通过注解配置的Filter,那么会优先执行web.xml中配置的Filter。