欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JavaWeb三大组件之过滤器Filter

程序员文章站 2024-02-09 17:12:16
...

过滤器

简述
过滤器同Servlet结构大致相同,但功能上有着很大差异,在JavaWeb中它负责拦截一些没必要或被限制的访问,即过滤请求或进行一些初始化的设置。
注:当用户访问某个Servlet或者其它文件时,首先会执行部署在这个请求上的Filter,如果Filter“放行”,则请求成功,如果“不放行”,则请求被拦截,访问失败!
如何实现
1.新建类实现Filter接口
2.在web.xml中注册(与Servlet相似)
过滤的内容:
jsp、Servlet、css、js等都可以过滤

xml配置内容及过滤器的实现

xml配置内容

<filter>
    <filter-name>MyFilter</filter-name>
    <filter-class>tqb.filter.demo1.MyFilter</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>MyFilter</filter-name>
    <!-- <url-pattern>/*</url-pattern>指的是过滤所有内容 -->
    <!-- <url-pattern>/AServlet</url-pattern>指的是过滤AServlet -->
    <url-pattern>/AServlet</url-pattern>
  </filter-mapping>

过滤器的实现

package tqb.filter.demo1;

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 MyFilter implements Filter {

    /**
     * 过滤器销毁之前执行
     */
    @Override
    public void destroy() {
        System.out.println("destroy()...");
    }

    /**
     * 每访问一次被过滤的内容,执行一次该方法
     * FilterChain:过滤器链,负责“放行”
     */
    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain fc)
            throws IOException, ServletException {
        System.out.println("执行doFilter()...过滤!");

        //对过滤的内容进行"放行"
        fc.doFilter(req, resp);

        System.out.println("放行成功!!!");
    }

    /**
     * 过滤器创建之后执行,可进行一些初始化的设置
     */
    @Override
    public void init(FilterConfig arg0) throws ServletException {
        System.out.println("init()...");
    }

}

Filter#FilterConfig介绍

该类同ServletConfig类似,具体方法如下

方法 作用
getFilterName() 获取过滤器的名称
getInitParameter() 获取初始化参数值
getInirParameterNames() 获取初始化参数
getServletContext() 获取application(若不了解,请看Servlet相关内容)

Filter#FilterChain介绍

方法 作用
doFilter(ServletRequest req,ServletResponse resp) 对过滤的内容进行放行(执行目标资源,或者执行下一个过滤器)

多个过滤器的执行顺序

注:与filter-mapping在xml文件的顺序有关,谁在前先执行谁

新建Filter2过滤器
xml配置文件

<filter>
    <filter-name>Filter2</filter-name>
    <filter-class>tqb.filter.demo1.Filter2</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>Filter2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

java文件

package tqb.filter.demo1;

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 Filter2 implements Filter {

    @Override
    public void destroy() {

    }

    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain fc)
            throws IOException, ServletException {
        System.out.println("Filter2_start");
        fc.doFilter(arg0, arg1);
        System.out.println("Filter2_stop");
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {

    }

}

更改MyFilter中的doFilter方法为

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain fc)
            throws IOException, ServletException {
        System.out.println("Filter1_start");
        //对过滤的内容进行放行
        fc.doFilter(req, resp);
        System.out.println("Filter1_stop");
    }

浏览器访问AServlet的输出结果
JavaWeb三大组件之过滤器Filter

Filter的四种拦截方式

请求(REQUEST)
转发(FORWARD)
包含(INCLUDE)
错误(ERROR)
如何配置?

<filter-mapping>
    <filter-name>MyFilter</filter-name>
    <url-pattern>/AServlet</url-pattern>
    <!-- 默认方式,即过滤请求 -->
    <dispatcher>REQUEST</dispatcher>
    <!-- 过滤转发 -->
    <dispatcher>FORWARD</dispatcher>
    <!-- 过滤包含 -->
    <dispatcher>INCLUDE</dispatcher>
    <!-- 过滤错误,如我们设置好的error页面(如下) -->
    <dispatcher>ERROR</dispatcher>
</filter-mapping>
<!-- 
<error-page>
    <error-code>404</error-code>
    <location>xxx</location>
</error-page>
-->