过滤器Filter

过滤器是一个特殊的servlet,所有的过滤器都要实现Filter接口

定义过Filter以后要在web.xml中进行注册

<filter>
   <filter-name>注册过滤器的名称</filter-name>
   <filter-class>过滤器所在类的完整名称</filter-class>
</filter>
                             
<filter-mapping>
   <filter-name>注册号的过滤器的名称</filter-name>
   <url-pattern>配置拦截的资源/*拦截所有的</url-pattern>
      *   /* 表示拦截所有的资源
      *   *.jsp 表示拦截所有的jsp
      *   /c.jsp  表示只拦截根路径下的c.jsp
      *   *.do  * 前不加/
    <servlet-name>指定拦截的servlet名称,servlet-name标签中的值</servlet-name>
        可以讲jsp页面配置成一个servlet,然后使用上面的方法拦截,访问的时候输入的是配置的servlet名称
                                     
    <dispatcher>REQUEST</dispatcher> 
      当用户直接访问页面时,web容器将会调用过滤器,默认值
         如果目标资源是通过getRequestDispatcher()的include或者forward,不会通过过滤器
    <dispatcher>FORWARD</dispatcher>
       当用户转发时走过滤器,
       如果目标资源是通过getRequestDispatcher()的forward访问时要走过滤器
         使用forward拦截的路径是要转发的那个页面的路径
   <dispatcher>FORWARD</dispatcher>
       如果目标资源是通过getRequestDispatcher()的include访问时要走过滤器
        使用include时拦截的路径还是引入前的那个路径,不会发生变化
   <dispatcher>ERROR</dispatcher>
        如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用
                             
     ** 可以同时配置REQUEST和FORWARD和INCLUDE和ERROR         
<filter-mapping>

过滤器的生命周期

init,doFilter,destroy

过滤器中构造方法的优先级别大于init方法

构造方法执行一次,表示过滤器是单实例多线程的运行的,和servlet一样

init(FilterConfig filterConfig)

初始化,在服务器开启的时候就被初始化(由servlet容器调用)

而servlet要想在服务器启动的时候执行,需要配置一个load-on-startup 属性

FilterConfig

* getFilterName();// 获取filter的注册名称

* getInitParameter(“在web.xml中配置的初始化参数”);

* Enumeratin em =getInitParameterNames();//遍历过滤器中所有的配置的参数

while(em.hasmoreElement){

name=em.nextElement();

}

* getServletContext().getInitParameter(“name”);

doFilter(ServletRequest request, ServletResponse response,FilterChain chain)

在生命周期中执行多次,客户端每发送一次请求,该方法执行一次

由servlet容器调用

servletRequest 可以强转HttpServletRequest 可以强转

FiterChain chain

chain.doFilter(req,res);//放行

destroy()

只在服务器关闭的时候执行一次

同一个过滤器可以配置多个映射

一个映射可以配置多个过滤器,也叫过滤器的串联

如果有多个过滤器拦截同一个资源,执行的顺序是按照过滤器在web.xml中配置的filter-mapping的先后顺序执行

案列:通过过滤器设置编码格式

web.xml配置文件中的内容

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>com.filter.CharacterEncodingFilter</filter-class>
             
    <!--配置字符编码 -->
    <init-param>
      <param-name>encoding</param-name>
      <param-value>utf-8</param-value>
    </init-param>
             
    <!-- 配置响应需要的MIME类型 -->
    <init-param>
      <param-name>contentType</param-name>
      <param-value>text/html</param-value>
    </init-param>
             
    <!-- 配置是否设置响应的字符编码和MIME类型 -->
    <init-param>
      <param-name>isEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
           
  <filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
           
</web-app>

过滤器中的实现

public class CharacterEncodingFilter implements Filter {
     
    private String encoding; //接收编码
    private String contentType;
    private Boolean isEncoding;
     
    public void init(FilterConfig filterConfig) throws ServletException {
        this.encoding = filterConfig.getInitParameter("encoding");
        this.contentType = filterConfig.getInitParameter("contentType");
        String sisEncoding = filterConfig.getInitParameter("isEncoding");
        if (sisEncoding != null && !"".equals(sisEncoding.trim())) {
            this.isEncoding = Boolean.parseBoolean(sisEncoding);
        }
    }
     
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        // 只对post请求有效
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;
        String method = req.getMethod();
        if ("post".equalsIgnoreCase(method)) {
            if (req.getCharacterEncoding() == null) {
                if (this.encoding != null) {
                    req.setCharacterEncoding(this.encoding);
                }
            }
            if (this.isEncoding) { // true 执行
                if (this.encoding != null) {
                    response.setCharacterEncoding(this.encoding);
                }
                if (contentType != null) {
                    response.setContentType(contentType);
                }
            }
        }
        chain.doFilter(request, response);
    }
    public void destroy() {
    }
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注