过滤器

作者: 旦暮何枯 | 来源:发表于2019-03-19 16:42 被阅读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

    相关文章

      网友评论

          本文标题:过滤器

          本文链接:https://www.haomeiwen.com/subject/pelnmqtx.html