过滤器

2019-03-19  本文已影响0人  旦暮何枯

过滤器 Filter

用于对用户请求进行预处理,和对请求响应进行后处理的 web 应用组件。

过滤源:请求与响应
过滤规则:自定义过滤规则

过滤器工作原理

image.png

过滤器的应用场景

过滤器生命周期

过滤器的生成和销毁由 servlet 容器负责。

1.web-app 启动时,根据部署描述符的设置,创建 过滤器的实例对象,进行初始化。

在部署描述符中(web.xml),可对 filter 进行配置。 <filter-config>
2.过滤操作, dofilter 方法;

  1. web-app 被移除,或服务器被停用;执行 destroy 方法。

过滤器的创建

新建类继承 Filter 类,实现 Filter 类的 init, doFilter, destroy 方法。
过滤器的创建和 servlet 差不多;都需要在 部署描述符(web.xml)中进行注册,配置:

web.xml 注册 filter

    <filter>
        <filter-name>FilterTest</filter-name>
        <filter-class>FilterTest</filter-class>
        <init-param>
            <param-name>filterParam</param-name>
            <param-value>111</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>FilterTest</filter-name>
        <url-pattern>/hello/world/*</url-pattern>
    </filter-mapping>

java 创建 Filter 类:

该 Filter 的作用是检查用户是否已经登录;若登录,跳转到 /hello/world 目录下
否则跳转 index.html 页面

public class FilterTest implements Filter {
    public void destroy() {
    }

    public void doFilter(javax.servlet.ServletRequest req, javax.servlet.ServletResponse resp, javax.servlet.FilterChain chain) throws javax.servlet.ServletException, IOException {
        System.out.println("filter doFilter method");
        HttpServletRequest request = (HttpServletRequest) req;
        HttpSession session = ((HttpServletRequest) req).getSession();
        if (session.getAttribute("userName") == null ){
            HttpServletResponse response = (HttpServletResponse) resp;
            response.sendRedirect("../index.html");
        } else {
            chain.doFilter(req,resp);
        }
    }

    public void init(javax.servlet.FilterConfig config) throws javax.servlet.ServletException {
        System.out.println("filter init method");
        String value = config.getInitParameter("filterParam");
        System.out.println("filter config param: " + value);
    }

}

过滤器链

由多个过滤器组成。
请求按照在部署描述符中注册的先后顺序进行请求的过滤。

1.当第一个过滤器的 doFilter 方法被调用的时候,servlet 容器创建一个代表 filter链的 filterChain 对象传递给该方法。
2.在 doFilter 方法中如果开发调用了 filterChain 中的 doFilter 方法,servlet 容器会检查 filterchain 中是否还存在其他的 filter;若存在,继续调用 filter 方法;
3.若不存在其他的 filter, servlet 会调用对应的目标资源;即最后一个 filter 方法请求的 servlet 资源对象。

项目地址:https://github.com/wengfe/JAVA/tree/master/flitertest
上一篇下一篇

猜你喜欢

热点阅读