10-Filter过滤器

1.定义

  1. Filter过滤器是JavaWeb的三大组件之一。
  2. 是JavaEE的规范,即接口。

2.作用

  1. 拦截请求,过滤响应。

  2. 拦截请求的常用应用场景有:

  • 权限检查

  • 日记操作

  • 事务管理

3.使用步骤

要求:在Web工程下需要一个admin目录,这个目录下的所有资源都必须是用户登录之后才可以访问。

  1. 编写一个类去实现Filter接口
  2. 实现过滤方法doFilter()方法
  3. 到web.xml中去配置Filter的拦截路径
  • Filter的代码:
public class AdminFilter implements Filter {
    /**
     * 专门用于拦截请求,可以做权限检查
     * @param servletRequest
     * @param servletResponse
     * @param filterChain
     * @throws IOException
     * @throws ServletException
     */
    @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);
        }
    }
}	
  • Web.xml中的配置:
<filter-mapping>
        <filter-name>AdminFilter</filter-name>
        <url-pattern>/adminFilter</url-pattern>
</filter-mapping>
<servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>com.zl.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/loginServlet</url-pattern>
</servlet-mapping>

4.Filter的生命周期

  1. 构造器方法
  2. init初始化方法
  3. doFilter过滤方法
  4. destroy销毁方法

5.FilterConfig方法

定义

是Filter过滤器的配置文件类,Tomcat每次创建Filter时,也会同时创建FilterConfig类,这里包含了Filter配置文件的详细信息。

作用

获取Filter过滤器的配置内容:

  • 获取Filter的名称filter-name的内容
  • 获取在Filter中配置的init-param初始化参数
  • 获取ServletContext对象
  1. Java代码:
@Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //1、获取 Filter 的名称 filter-name 的内容
        System.out.println("filter-name的值是:" + filterConfig.getFilterName());
        //2、获取在 web.xml 中配置的 init-param 初始化参数
        System.out.println("初始化参数username的值是:"+filterConfig.getInitParameter("username"));
        System.out.println("初始化参数url的值是:" + filterConfig.getInitParameter("url"));
        //3、获取 ServletContext 对象 
        System.out.println(filterConfig.getServletContext());
    }
  1. Web.xml配置:
<filter>
        <filter-name>AdminFilter</filter-name>
        <filter-class>com.zl.filter.AdminFilter</filter-class>
        <init-param>
            <param-name>username</param-name>
            <param-value>root</param-value>
        </init-param>
        <init-param>
            <param-name>url</param-name>
            <param-value>jdbc:mysql://localhost:3306/test</param-value>
        </init-param>
</filter>

6.FilterChain过滤器链

特点

  1. 多个Filter过滤器执行时,所有filter和目标资源默认都执行在同一个线程中。
  2. 多个filter共同执行的对象,都使用同一个Request对象。
  3. 在多个Filter过滤器执行时,执行的优先顺序是根据它们在web.xml中配置的先后顺序决定。

doFilter方法

FilterChain.doFilter()方法的作用:

  • 如果有Filter,则执行下一个Filter过滤器。
  • 如果没有Filter,则执行目标资源。

7.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结尾**才能拦截到

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

以上配置的路径,表示请求地址必须以**.do结尾**才能拦截到

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

以上配置的路径,表示请求地址必须以**.action结尾**才能拦截到

8.ThreadLocal

作用

可以解决多线程数据安全问题,可以给当前线程关联一个数据(变量、对象、数组、集合)。

特点

  1. ThreadLocal可以为当前线程关联一个数据(可以像Map一样存取数据,key为当前线程)。
  2. 每一个ThreadLocal对象,只能为当前线程关联一个数据,如果要为当前线程关联多个数据,则需要使用多个ThreadLocal对象。
  3. 每一个ThreadLocal对象实例化时,一般都是static类型。
  4. ThreadLocal中保存数据,在线程销毁后,会由JVM虚拟机自动释放。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值