JavaWeb三大组件之过滤器Filter

过滤器

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

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

xml配置内容

<filter>
    <filter-name>MyFilterfilter-name>
    <filter-class>tqb.filter.demo1.MyFilterfilter-class>
  filter>

  <filter-mapping>
    <filter-name>MyFilterfilter-name>
    
    
    <url-pattern>/AServleturl-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>Filter2filter-name>
    <filter-class>tqb.filter.demo1.Filter2filter-class>
  filter>

  <filter-mapping>
    <filter-name>Filter2filter-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_第1张图片

Filter的四种拦截方式

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

<filter-mapping>
    <filter-name>MyFilterfilter-name>
    <url-pattern>/AServleturl-pattern>
    
    <dispatcher>REQUESTdispatcher>
    
    <dispatcher>FORWARDdispatcher>
    
    <dispatcher>INCLUDEdispatcher>
    
    <dispatcher>ERRORdispatcher>
filter-mapping>

你可能感兴趣的:(javaweb)