过滤器基础知识

1.过滤器简介:

  • Filter是J2EE Servlet模块下的组件
  • 作用:是对URL进行统一的拦截处理
  • 通常用于应用程序层面进行全局处理
    1.png

2.开发过滤器三要素:

  • 任何过滤器都要实现javax.servlet.Filter接口
  • 在Filter接口的doFilter()方法中编写过滤器的功能代码
  • 在web.xml中对过滤器进行配置,说明拦截URL的范围

    web.xml:
    <!--filter标签用于说明那个是类是过滤器,并在应用启动时自动加载 -->

     <filter>
           <filter-name>MyFirstFilter</filter-name>
           <filter-class>com.imooc.filter.MyFirstFilter</filter-class>
     </filter>
     <!-- 所有url都过滤 -->
     <filter-mapping>
         <filter-name>MyFirstFilter</filter-name>
         <url-pattern>/*</url-pattern>
     </filter-mapping>
    

3.过滤器生命周期:

  • 初始化:Filter.init()
  • 提供服务:FIlter.doFilter()
  • 销毁:Filter.destory()
  • 过滤器对象在Web应用启动时被创建且全局唯一
  • 唯一的过滤器对象在并发环境中采用“多线程”提供服务

4.过滤器的两种开发形式

  • 在web.xml中配置过滤器属性:适合大型项目,应用全局过滤!
  • 在过滤器的类文件中添加注解
    2.png

5.开发字符集过滤器

web中文乱码问题:

//过滤器配置utf-8,防止中文乱码
//不建议配置在过滤器类中,修改不方便,建议写在web.xml
public class MyFirstFilter implements Filter{
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // TODO Auto-generated method stub
        System.out.println("过滤器已生效");
        //字符过滤,中文乱码
        //强制转换类型
        HttpServletRequest req=(HttpServletRequest)request;
        req.setCharacterEncoding("UTF-8");
        HttpServletResponse res=(HttpServletResponse)response;
        res.setContentType("text/html;charset=UTF-8");
        chain.doFilter(request, response);    
    }
 ....

6.过滤器参数化:

  • 过滤器为了灵活性,允许配置信息放在web.xml
  • 在web.xml中配置<init-param>设置过滤器参数
  • 可能会产生变化的配置放到web.xml

    <init-param>
    </init-param>

    package com.imooc.filter;

    public class MyFirstFilter implements Filter{
    //定义变量接受web.xml中定义编码格式变量

    private String encoding;
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // TODO Auto-generated method stub
        encoding=filterConfig.getInitParameter("encoding");
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // TODO Auto-generated method stub
        System.out.println("过滤器已生效");
        //字符过滤,中文乱码
        //强制转换类型
        HttpServletRequest req=(HttpServletRequest)request;
        req.setCharacterEncoding(encoding);
        HttpServletResponse res=(HttpServletResponse)response;
        res.setContentType("text/html;charset="+encoding);
        chain.doFilter(request, response);
    }

    }
    web.xml中:
    <filter>

    <filter-name>MyFirstFilter</filter-name>
    <filter-class>com.imooc.filter.MyFirstFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>

    </filter>
    <filter-mapping>

    <filter-name>MyFirstFilter</filter-name>
    <url-pattern>/*</url-pattern>

    </filter-mapping>

7.url-pattern设置过滤范围
常用写法:

  • /index.jsp-----精确匹配
  • /servlet/*------以前缀进行模糊匹配
  • *.jsp------------以后缀进行模糊匹配
  • /*----------------匹配所有
  • / 指映射到web应用根路径,且只对servlet生效
  • 默认首页index.jsp会让映射地址“ / ”失效
  • / 与 / 含义不同,/ 指根路径,/ 指所有路径

8.过滤链

  • 多个过滤器在一个web容器中的
  • 每一个过滤器具有单独职能
  • 配置型过滤器的执行顺序以web.xml中的<filter-mapping>顺序为准,注解型过滤器过滤链是按照过滤器的类名的字母升序的顺序依次执行
  • 过滤器调用chain.doFilter()将请求向后传递,直到被处理,等处理完成后会逆向返回

标签: none

添加新评论