[JavaWeb] Servlet Filter

时间:2022-02-11 04:37:08

作用:

Servlet 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息。

可以将一个或多个 Servlet 过滤器附加到一个 Servlet 或一组 Servlet。Servlet 过滤器也可以附加到 JavaServer Pages (JSP) 文件和 HTML 页面。调用 Servlet 前调用所有附加的 Servlet 过滤器。

Servlet 过滤器是可用于 Servlet 编程的 Java 类,可以实现以下目的:

  • 在客户端的请求访问后端资源之前,拦截这些请求。
  • 在服务器的响应发送回客户端之前,处理这些响应

编写Filter实际上是实现Filter接口,在调用servlet之前会先经过过滤器

步骤:

新建一个Filter类,然后编写必要的initFilter和doFilter方法

package com.example.filter;

        import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException; @WebFilter(filterName = "FirstFilter")
public class FirstFilter implements Filter {
public void destroy() {
} public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("doFilter www.baidu.com");
chain.doFilter(req, resp);
} public void init(FilterConfig config) throws ServletException {
//获得初始化参数
String siteName = config.getInitParameter("Site");
System.out.println("initFilter "+siteName);
} }

  

之后需要在web.xml里面进行注册,配置Filter的名字,所作用的servlet等

<?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_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>com.example.servlet.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FirstServlet</servlet-name>
<url-pattern>/TomcatTest/FirstServlet</url-pattern>
</servlet-mapping> <servlet>
<servlet-name>DisplayServlet</servlet-name>
<servlet-class>com.example.servlet.DisplayServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DisplayServlet</servlet-name>
<url-pattern>/TomcatTest/DisplayServlet</url-pattern>
</servlet-mapping> <filter>
<filter-name>FirstFilter</filter-name>
<filter-class>com.example.filter.FirstFilter</filter-class>
<init-param>
<param-name>Site</param-name>
<param-value>www.baidu.com</param-value>
</init-param>
</filter>
<!--配置Filter作用的Servlet-->
<filter-mapping>
<filter-name>FirstFilter</filter-name>
<url-pattern>/TomcatTest/DisplayServlet</url-pattern>
</filter-mapping>
</web-app>

<url-pattern>标签里填的是作用的servlet的名字,Filter会对这个servlet进行处理,如果这个Filter对所有的Servlet作用,则填入/*

一个Javaweb项目中可以有多个Filter,形成一个过滤器链,调用他们的顺序取决于他们在web.xml中的位置,在前则先调用,在后则后调用

Filter的生命周期:

public void init(FilterConfig config)

Filter对象的创建由Web服务器负责,在Web服务器启动的时候会创建一个Filter对象,并调用initFilter方法进行初始化,并且整个过程initFilter方法只执行一次,只创建一个Filter对象

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)

每次filter进行拦截都会执行

public void destroy()

销毁对象时执行

Web.xml的标签介绍

  • <filter>指定一个过滤器。
    • <filter-name>用于为过滤器指定一个名字,该元素的内容不能为空。
    • <filter-class>元素用于指定过滤器的完整的限定类名。
    • <init-param>元素用于为过滤器指定初始化参数,它的子元素<param-name>指定参数的名字,<param-value>指定参数的值。
    • 在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。
  • <filter-mapping>元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径
    • <filter-name>子元素用于设置filter的注册名称。该值必须是在<filter>元素中声明过的过滤器的名字
    • <url-pattern>设置 filter 所拦截的请求路径(过滤器关联的URL样式)
  • <servlet-name>指定过滤器所拦截的Servlet名称。
  • <dispatcher>指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST,INCLUDE,FORWARDERROR之一,默认REQUEST。用户可以设置多个<dispatcher>子元素用来指定 Filter 对资源的多种调用方式进行拦截。
  • <dispatcher>子元素可以设置的值及其意义
    • REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。
    • INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
    • FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
    • ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。