首页 > 代码库 > Fiilter

Fiilter

过滤器

  过滤请求和响应

  作用:
        自动登录.
        统一编码.
        过滤关键字
        ....

  Filter是一个接口

编写filter步骤:

  • 1.编写一个类

        a.实现filter接口

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class TestFilter implements Filter {

    @Override
    public void destroy() {
        // TODO Auto-generated method stub
    }

    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1,
            FilterChain arg2) throws IOException, ServletException {
        // TODO Auto-generated method stub
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub
    }
}

        b.重写方法

  • 2.编写配置文件

        a.注册filter

<filter>
        <filter-name>TestFilter</filter-name>
        <filter-class>com.TestFilter</filter-class>
</filter>

        b.绑定路径

<filter-mapping>
    <filter-name>TestFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
  • 3.测试

Filter接口的方法:
    init(FilterConfig config):初始化操作
    doFilter(ServletRequest request, ServletResponse response, FilterChain chain):处理业务逻辑
    destroy() :销毁操作
filter的生命周期(了解)
    filter单实例多线程
    filter在服务器启动的时候 服务器创建filter 调用init方法 实现初始化操作
    请求来的时候,创建一个线程 根据路径调用dofilter 执行业务逻辑
    当filter被移除的时候或者服务器正常关闭的时候 调用destory方法 执行销毁操作.
FilterChain:过滤链
    通过chain的dofilter方法,可以将请求放行到下一个过滤器,直到最后一个过滤器放行才可以访问到servlet|jsp
    doFilter()放行方法
★url-pattern配置
    3种
    完全匹配    必须以"/" 开始  例如: /a/b
    目录匹配    必须以"/" 开始 以"*"结束  例如:/a/b/*
    后缀名匹配    以"*."开始 以字符结束   例如 :  *.jsp  *.do  *.action
例如:
    afilter  路径  /*
    bFilter  路径  /demo4
★一个资源有可能被多个过滤器匹配成功,多个过滤器的执行顺序是按照web.xml中filter-mapping的顺序执行的
    

filterConfig:(了解)
        过滤器的配置对象
        作用:
            获取全局管理者
            获取当前filter的名称
            获取当前filter的初始化参数
    
filter-mapping的子标签(理解)
        servlet-name:匹配那个servlet 值写的是serlvet标签中servlet-name的值
            建议:不要在一个filter中重复的匹配servlet
                例如: serlvet的url-pattern为  /a/b/hello   serlvetname:HelloServlet
                    如果filter中的url-pattern  /*
                    最好不要在写 servlet-name:HelloServlet

<filter>
    <filter-name>Name4ServletFilter</filter-name>
    <filter-class>com.servletname.Name4ServletFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>Name4ServletFilter</filter-name>
    <servlet-name>Demo11Servlet</servlet-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

    不要这样写    
      url-pattern和servlet-name都会拦截Demo11Servlet
      在7.0版本回执行两次
        dispatcher:
            匹配哪种请求
            默认的是REQUEST,一旦显式的写出来哪种请求,默认就不起作用了
                理解
                    REQUEST:从浏览器发送过来的请求(默认) 理解
                    FORWARD:转发过来的请求 理解
                了解
                    ERROR:因服务器错误而发送过来的请求
                    INCLUDE:包含过来的请求
      通过filter实现服务器统一错误页面

<error-page>
    <error-code>404</error-code>
    <location>/404.jsp</location>
</error-page>
<error-page>
    <error-code>500</error-code>
    <location>/500.jsp</location>
</error-page>

Fiilter