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> 表面映射的路径。