Filter

Posted ascto

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Filter相关的知识,希望对你有一定的参考价值。

Filter

什么是Filter过滤器

1.Filter过滤器它是JavaWeb的三大组件之一,三大组件分别是:Servlet程序、Listener监听器、Filter过滤器

2.Filter过滤器它是JavaEE规范,也就是接口。

3.它的作用是:拦截请求,过滤响应。

拦截请求常见的应用场景:

1.权限检查

2.日记操作

3.事务管理

Filter的初体验

要求在你的web工程下,有一个admin目录。这个admin目录下的所有资源(html页面,jpg图片,jsp文件等)都必须是用户登录之后才允许访问。

思考:根据之前我们学过内容,我们知道,用户登录之后都会把用户登录信息保存到session域中,所以要检查用户是否登录,可以判断session中是否包含有用户登录的信息即可。

 /*专门用于拦截请求,过滤响应。可以做权限检查*/
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException 
        HttpServletRequest httpServletRequest=(HttpServletRequest)servletRequest;
        HttpSession session=httpServletRequest.getSession();
        Object user=session.getAttribute("user");
        if (user==null)
            servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
            return;
        else
            /*让程序继续往下访问目标资源*/
            filterChain.doFilter(servletRequest,servletResponse);
        

    
<!--filter标签用于配置一个filter过滤器-->
    <filter>
        <!--取别名-->
        <filter-name>AdminFilter</filter-name>
        <!--配置filter的全类名-->
        <filter-class>filter.AdminFilter</filter-class>
    </filter>

    <!--配置Filter过滤器的拦截路径-->
    <filter-mapping>
        <!--表示当前的拦截路径给哪个filter使用-->
        <filter-name>AdminFilter</filter-name>
        <!--配置拦截路径
        / 表示请求地址为 :http://ip:port/工程路径/ 映射到web目录

        /admin/*表示请求地址为http://ip:port/工程路径/admin/*
        -->
        <url-pattern>/admin/*</url-pattern>
    </filter-mapping>

Filter过滤器的使用步骤:

1.编写一个类去实现Filter接口。

2.实现过滤方法doFilter()

3.到web.xml中去配置Filter的拦截路径

Filter的生命周期

filter的生命周期包含几个方法

1.构造器方法

2.init初始化方法

第一二步在web工程启动时执行(Filter已经创建)

3.doFilter过滤方法

第三步,每次拦截到请求,就会执行

4.destroy销毁

第四步,停止web工程的时候,就会执行(停止web工程也会销毁filter过滤器)

FilterConfig类

FilterConfig类,它是Filter过滤器的配置文件类

Tomcat每次创建Filter的时候,也会去创建一个FilterConfig类。这里包含了Filter配置文件的配置信息。

FilterConfig的作用是:获取Filter过滤器的配置内容

1.获取Filter的名称filter-name的内容

2.获取在Filter中配置的init-param初始化参数

3.获取ServletContext对象

@Override
    public void init(FilterConfig filterConfig) throws ServletException 


//        1.获取Filter的名称filter-name的内容
        System.out.println("filter-name的值是:"+filterConfig.getFilterName());

//        2.获取在Filter中配置的init-param初始化参数
        System.out.println("初始化参数username的值为"+filterConfig.getInitParameter("username"));
        System.out.println("初始化参数url的值为"+filterConfig.getInitParameter("url"));
//        3.获取ServletContext对象
        System.out.println(filterConfig.getServletContext());

        System.out.println("2.Filter的init初始化方法");
    

控制台结果:

FilterChain过滤器链

Filter:过滤器

Chain:链

FilterChain,就是过滤器链(多个过滤器如何一起工作)

Filter的拦截路径

精准匹配

<url-pattern> /target.jsp</url-pattern>

以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/target.jsp

目录匹配

<url-pattern> /admin/*</url-pattern>

以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/admin/*

后缀名匹配

<url-pattern>*.html</url-pattern>

以上路径配置,表示请求地址必须以.html结尾才会拦截到

/admin/*`

以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/admin/*

后缀名匹配

<url-pattern>*.html</url-pattern>

以上路径配置,表示请求地址必须以.html结尾才会拦截到

Filter过滤器只关心请求的地址是否匹配,不管资源是否存在!

以上是关于Filter的主要内容,如果未能解决你的问题,请参考以下文章

filter_var() 验证邮箱ipurl的格式 php

Monk快速开发框架前期约定

Filter 禁止浏览器缓存动态资源,例如JSP资源 -学习笔记

同时使用FFMPEG调整GIF的大小时的分带/结尾

r dplyr filter:正则表达式排除AND匹配

C++字符串结尾是不是有'\0'也就是string类的结尾是啥?