作用:
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()
销毁对象时执行
来源: http://www.bubuko.com/infodetail-2768436.html