JavaWeb——过滤器和监听器

  • Servlet 过滤器是从 Servlet 2.3 规范开始新增的功能,并在 Servlet 2.4 规范中得到增强,监听器可以监听到 Web 应用程序启动和关闭。创建过滤器和监听器需要继承相应的接口,并进行配置。

一、Servlet 过滤器

1、Servlet 过滤器为何物

  • Servlet 过滤器,打个比方来说,就像是一张滤网,过滤杂质,位于客户端到客户端所请求的目标资源之间。
  • Servlet 过滤器的主要作用就是对来自客户端的请求进行过滤处理,并将过滤后的请求转交给下一个资源。
  • 过滤器实质上是 Web 应用的一个组成部件,承担了 Web 应用安全的部分功能,阻止不合法的请求和非法的访问。

2、Servlet 过滤器核心对象

  • Servlet 过滤器的核心对象为三个接口对象,名为 Filter、FilterConfig 和 FilterChain,位于 javax.servlet 包中。
2.1、Filter
  • 每个过滤器对象都要直接或间接的实现 Filter 接口,Filter 有如下三个方法:

方法

作用

public void init(FilterConfig config)throws ServletException

过滤器初始化

public void doFilter(ServletRequest req,ServletResponse res, FilterChain chain) throws IOException, ServletException

过滤请求

public void destroy()

销毁过滤器对象

2.2、FilterConfig
  • FilterConfig 接口由 Servlet 容器实现,用于获取过滤器中的配置信息,其相应方法如下:

方法

作用

public String getFilterName()

获取过滤器的名字

public ServletContext getServletContext()

获取 Servlet 上下文

public String getInitParameter(String name)

获取过滤器的初始化参数值

public Enmueration getInitParameterNames()

获取过滤器的所有初始化参数

2.3、FilterChain
  • FilterChain 接口仍是由 Servlet 去实现,该接口只有一个 doFilter 方法。

3、Servlet 过滤器

3.1、示例
  • 首先创建一个 FilterTest.java 并继承 Filter 接口,可以使用 IDEA 的集成工具进行创建,代码如下:
package com.lyq.ServletFilterSet;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

@WebFilter(filterName = "FilterTest")
public class FilterTest implements Filter {
    private String testMsg;
    public void init(FilterConfig config) throws ServletException {
        testMsg = config.getInitParameter("test");
    }

    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        HttpServletRequest request = (HttpServletRequest) req;
        ServletContext context = request.getSession().getServletContext();
        context.setAttribute("test", testMsg);
        chain.doFilter(req, resp);
    }
}
  • 在 web.xml 的 <web-app> 里添加如下代码:
<filter>
    <filter-name>FilterTest</filter-name>
    <filter-class>com.lyq.ServletFilterSet.FilterTest</filter-class>
    <init-param>
        <param-name>test</param-name>
        <param-value>御承扬的博客</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>FilterTest</filter-name>
    <url-pattern>/FilterJSPSet/filterJSPTest.jsp</url-pattern>
</filter-mapping>
  • 在项目文件树的 web 节点下新建一个 FilterJSPSet 文件夹,并在该文件夹下面新建一个 filterJSPTest.jsp 文件,在里面编辑如下代码:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>过滤器示例</title>
    <style type="text/css">
        body{
            background: #e3c5e9;
            align-items: center;
        }
    </style>
</head>
<body>
<h2>欢迎访问,<br>
    这里是<%=application.getAttribute("test")%>
</h2>
</body>
</html>
  • Tomcat 运行,并在浏览器地址栏 index 后面加 FilterJSPSet/filterJSPTest.jsp 打开页面显示如下:
3.2、示例说明
(1)创建 Servlet 过滤器
  • 这一步主要就是新建一个 Filter 类,就是上述示例中的 FilterTest.java,该类体里有 init、doFilter 和 destroy 三个方法,分别对应 Filter 生命历程的初始化、业务逻辑和销毁,也就是说 doFilter 方法是最主要的
(2)Servlet 过滤器配置和映射
  • 这一步全在 web.xml 中进行,配置 Servlet 过滤器就是在 web.xml 文件中添加 <filter></filter> 标签,并在该标签里添加 <filter-name></filter-name> 子标签,这一个声明过滤器名称的标签,与之配套的是 <filter-class></filter-class> 标签,这是一个声明过滤器包括路径在内的完整类名的标签,而后根据需要可以对过滤器中的属性初始化,用的是 <init-param></init-param>,标签里用 <param-name></param-name> 和 <param-value></param-value> 初始化参数。
  • 映射过滤器则使用 <filter-mapping></filter-mapping> 标签,该标签里用 <filter-name></filter-name> 表明需要映射的过滤器是哪个,用 <url-pattern></url-pattern> 表面映射的路径。