1、Filter简介

Filter 技术是servlet 2.3 新增加的功能。servlet2.3是sun公司于2000年10月发布的,它的开发者包括许多个人和公司团体,充分体现了sun公司所倡导的代码开放性原则。在众多参与者的共同努力下,servlet2.3比以往功能都强大了许多,而且性能也有了大幅提高。

常见应用场景:URL级别的权限控制;过滤敏感词汇;中文乱码问题等等。

2、核心方法

22090307

3、Filterchain接口

在 Web 应用中,可以部署多个 Filter,若这些 Filter 都拦截同一目标资源,则它们就组成了一个 Filter 链(也称过滤器链)。

返回值类型方法描述
voiddoFilter(ServletRequest request ,ServletResponse response)使用该方法可以调用过滤器链中的下一个 Filter 的 doFilter() 方法,若该 Filter 是链中最后一个过滤器,则调用目标资源的 service() 方法。

4、简单使用

注解配置 @WebFilter("/*")

Filter解决乱码问题

@WebServlet("/servletDemo01")
public class ServletDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("你好 ServletDemo01");
        System.out.println("01.....");
    }
}

@WebServlet("/servletDemo02")
public class ServletDemo02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("你好 ServletDemo02");
        System.out.println("02.....");
    }
}

@WebFilter("/*")
public class FilterDemo implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("Filter.......");
        servletResponse.setContentType("text/html;charset=UTF-8");
        filterChain.doFilter(servletRequest,servletResponse);
    }
}

5、配置方式

1)注解方式

@WebFilter("拦截路径")

2)xml配置文件
    <filter>
        <filter-name>filterDemo</filter-name>
        <filter-class>com.codeui.top.FilterDemo</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>filterDemo</filter-name>
        <!-- 拦截路径 -->
        <url-pattern>/*</url-pattern>
    </filter-mapping>

如果有多个过滤器,取决于过滤器映射的顺序

6、生命周期

创建:应用加载时实例化并执行init初始化方法

服务:提供服务过程,执行doFilter方法

销毁:当应用卸载或者服务器停止时,对象销毁,执行destroy方法

7、FilterConfig接口

FilterConfig作用是获取Filter的相关配置信息

返回值方法名作用
StringgetFilterName()获得过滤器名称
StringgetInitParameter(String name)根据名称获取对应参数参数的值
EnumerationgetInitParameterNames()获取过滤器初始化参数名称的枚举
ServletContextgetServletContext()获取应用上下文ServletContext的对象

8、过滤器的五种拦截行为

我们的过滤器目前拦截的是请求,但是在实际开发中,我们还有请求转发和请求包含,以及由服务器触发调用的全局错误页面。默认情况下过滤器是不参与过滤的,要想使用,需要我们配置。配置的方式如下:

<!--配置过滤器-->
<filter>
    <filter-name>FilterDemo1</filter-name>
    <filter-class>com.itheima.web.filter.FilterDemo1</filter-class>
    <!--配置开启异步支持,当dispatcher配置ASYNC时,需要配置此行-->
    <async-supported>true</async-supported>
</filter>
<filter-mapping>
    <filter-name>FilterDemo1</filter-name>
    <url-pattern>/ServletDemo1</url-pattern>
    <!--过滤请求:默认值。-->
    <dispatcher>REQUEST</dispatcher>
    <!--过滤全局错误页面:当由服务器调用全局错误页面时,过滤器工作-->
    <dispatcher>ERROR</dispatcher>
    <!--过滤请求转发:当请求转发时,过滤器工作。-->
    <dispatcher>FORWARD</dispatcher>
    <!--过滤请求包含:当请求包含时,过滤器工作。它只能过滤动态包含,jsp的include指令是静态包含-->
    <dispatcher>INCLUDE</dispatcher>
    <!--过滤异步类型,它要求我们在filter标签中配置开启异步支持-->
    <dispatcher>ASYNC</dispatcher>
</filter-mapping>