过滤器Filter(一)

Filter简介

filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放行,并且可以对目标资源访问前后进行逻辑处理

Filter实现流程图

Filter使用步骤

  1. 编写一个filter类实现Filter接口
  2. 完成接口中未实现的方法(主要是doFilter方法)
  3. 在web.xml配置Filter或者使用注释配置

FIilterApi

Filter生命周期

  • 创建:服务器启动就创建该filter对象
  • 销毁:服务器关闭filter就销毁

方法

init()

参数:FilterConfig,表示该过滤器的配置器信息的对象,内部封装是filter配置信息

package demo;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import java.io.IOException;

@WebFilter(filterName = "demoFilter", initParams = {@WebInitParam(name = "namespace", value = "demo")})
public class DemoFilter implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        chain.doFilter(req, resp);
    }

    public void init(FilterConfig config) throws ServletException {
        System.out.println(config.getInitParameter("namespace"));
    }
}

运行结果:demo

在xml中配置初始化参数:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    <filter>
        <filter-name>demoFilter</filter-name>
        <filter-class>demo.DemoFilter</filter-class>
        <init-param>
            <param-name>namespace</param-name>
            <param-value>test</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>demoFilter</filter-name>
        <servlet-name>demoServlet</servlet-name>
    </filter-mapping>
</web-app>

doFilter()

参数:ServletReqeust ServletResponse FilterChain

  • ServletRequest&ServletResponse:tomcat根据请求封装的reqeust以及response对象,等价于Servlet的Service方法参数reqeust以及response
  • FilterChain:过滤器链对象,通过该对象的doFilter方法可以放行该请求

destory()

Filter对象销毁的时候执行

Filter配置

web.xml进行配置

配置指定访问的Servlet

配置访问指定servletA时执行Filter过滤器B

<filter>
	<filter-name>B</filter-name>
	<filter-class>demo.DemoFilterA</filter-class>
</filter>
<filter-mapping>
	<filter-name>B</filter-name>
	<servlet-name>A</servlet-name>
</filter-mapping>

配置指定访问的Url

配置访问指定url:/A

<filter>
	<filter-name>B</filter-name>
	<filter-class>demo.DemoFilterA</filter-class>
</filter>
<filter-mapping>
	<filter-name>B</filter-name>
	<url-pattern>/A</url-pattern>
</filter-mapping>

配置指定访问的Url范围比指定Servlet要大,建议使用url-pattern

url-pattern配置时

  • 完全匹配: /servlet1
  • 目录匹配: /aaa/bbb/*
  • /user/*:访问前台的资源进入此过滤器
  • /admin/*:访问后台的资源时执行此过滤器
  • 扩展名匹配 *.abc *.jsp

配置初始化参数

<filter>
	<filter-name>demoFilter</filter-name>
	<filter-class>demo.DemoFilter</filter-class>
	<init-param>
		<param-name>namespace</param-name>
		<param-value>test</param-value>
	</init-param>
</filter>
<filter-mapping>
	<filter-name>demoFilter</filter-name>
	<servlet-name>demoServlet</servlet-name>
</filter-mapping>

Servlet3.0注解配置

格式

@WebFilter(filterName="demo",urlPatterns="/*")

如需配置多个url:

@WebFilter(filterName="demo",urlPatterns={"/a" , "/b"})

配置扩展

参照Servlet3.0 注解相关属性

@WebServlet注解的相关属性

NO. 属性名 描述
1 asyncSupported 声明Servlet是否支持异步操作模式
2 description Servlet的描述信息
3 displayName Servlet的显示名称
3 initParams Servlet的初始化参数
5 name Servlet的名称
6 urlPatterns Servlet的访问URL
7 value Servlet的访问URL

Filter部署步骤

  1. 先配置Filter(web.xml或者annotation)
  2. 编写配置好的Filter类
  3. 完成doFilter()方法,内部功能