Servlet过滤器API
过滤器是一个用于执行过滤操作的对象,例如转换、记录、压缩、加密和解密、输入验证等等。当一个应用程序被预处理和后处理时,被调用的对象被过滤。
过滤器是配置的,在执行过滤活动时使用。过滤器的接口可以在javax.servlet package 。
要创建一个过滤器类,我们必须导入javax. servlet 并实现过滤器接口。根据用户和开发者的要求,可以创建几个过滤器来执行不同的任务。
目标
阅读本文后,读者应该能够理解以下内容。
- 一个servlet过滤器的定义。
- 使用过滤器的好处。
- 过滤器的接口,如
Filter接口、FilterConfing接口和其他接口。 - 与上述接口相关的方法以及它们的功能。
- 利用实例,学习如何在计算机程序中使用过滤器。
先决条件
你将需要以下工具来学习本文的内容。
- 在你的机器上应安装Eclipse或其他开源的Java编辑器。
- 安装一个网络浏览器。
- 安装TomCat服务器或任何其他服务器。在这种情况下,我们将使用TomCat版本9。
- 对Java编程语言有基本的了解。
- 需要对servlet有一个基本的了解。
- 具备使用任何Java IDE、Tomcat或类似服务器构建和运行Java代码的坚实知识。
什么是Servlet过滤器,它们是如何工作的
Servlet过滤器的定义
过滤器是执行和定制过滤操作的Java类,它通过以下方式完成。
- 在客户端请求到达后端资源之前拦截它们
- 在将服务器响应发回给客户端之前,改变服务器响应。
Servlet过滤器如何工作

解释一下。
- 当一个请求进入Web容器时,它被检查是否有过滤器的URL模式与传入的URL相匹配。
- Web
Container将请求发送到具有匹配URL模式的第一个过滤器,以执行其功能。
然后,第一个过滤器检查是否有第二个Filter ,有匹配的URL,该过滤器的代码被运行,这将持续到没有找到更多的URL模式匹配的过滤器。
如果没有错误,请求就被转发到目标Servlet。因此,我们知道,只有在成功完成所有相关的Filter之后,请求才会被传递到目的地Servlet。
Servlet将响应返回给调用者,然后将响应传递给Web容器,后者再将其传递给客户端。
过滤器的使用及其优点
过滤器在以下领域使用。
- 验证。
- 图像转换。
- 数据的压缩。
- 加密。
- 审计和记录,仅举几例。
过滤器的用途
根据上面提到的应用领域,我们可以得出过滤器的以下用法。
- 压缩数据。
- 追踪所有入站请求。
- 协助激活资源访问事件。
- 用于数据的加密和解密。
- 用于输入的验证。
- 转换。
优点是
- 过滤器可以被改变或用不同的过滤器替换。在这种情况下,过滤器是可插拔的。
- 其中一个过滤器不需要依赖另一个资源。
- 过滤器需要较少的维护。
过滤器的API
servlet过滤器有其API,即。Filter、FilterChain和FilterConfig,解释如下。
过滤器
我们必须实现Servlet的 "过滤器 "接口,这是javax. servlet 包的一部分,以创建一个过滤器。
创建一个过滤器
下面的步骤是创建一个Filter程序。
- 创建一个实现接口的Java类
Filter。 - 设置过滤器的参数。
- 最后,做一个过滤器的映射。
方法
void init():init()方法初始化了过滤器参数;它通知Web容器需要激活一个过滤器。只需要一个参数,即。
public void init(FilterConfig parameterName) throws ServletException
void doFilters():这个方法是Filter接口中最重要的,它调用下一个过滤器。
它需要三个参数。
- ServletRequest obj
- ServletResponse obj
- FilterChain obj,实现方式如下。
Public void doFilters(ServletRequest request, ServletResponse response,FileterChain chain)throws ServletException,IOException
void destroy():这个方法表示过滤器已经完成了它的职责或被从服务中移除。用户可以重写这个方法来编写整理逻辑,比如释放资源、对象等。
过滤器链
当执行链上的下一个过滤器或资源时,FilterChain的对象被传递给Filter接口。
方法
void doFilter():这个方法只在FilterChain接口中可用,在调用下面的Filter并传递所有需要的资源时使用。
public void doFilter(HttpServletRequest request, HttpServletResponse response);
FilterConfig
Web容器生成一个FilterConfig 对象,以便从web.xml文件中检索配置信息。
FilterConfig接口方法
在FilterConfig接口中,有四个方法。
void init():这个方法只被调用一次,用于设置过滤器。String getInitParameter:提供的参数名的参数值由该方法返回。getInitParameterNames():该方法返回所有类型枚举参数名称的列表。getServletContext():该方法返回ServletContext对象。
使用过滤器进行认证的例子
这个例子演示了如何使用Filter来实现验证。我们在这里使用两个过滤器:一个用来验证密码是否超过七个字符,另一个用来检查用户提供的用户名和密码。
如果密码长度正确,过滤器1将把请求转发给第二个过滤器。否则,将出现一个错误通知。
如果用户名和密码正确,第二个过滤器将把请求转发到Servlet页面;否则,将显示一个错误信息。
创建认证实例的步骤
我们假设你已经知道如何使用eclipse IDE并在本例中配置Tomcat服务器。
第一步:认证示例--动态网页项目
打开用于Java EE开发人员的Eclipse IDE。通过选择Files -> New -> Dynamic Web Project创建一个Web项目,并提供一个项目名称。我们将其命名为Authentication Example ,->选择Finish 。

第二步:创建一个登录的HTML页面
通过在项目资源管理器中右击Authentication Example ,选择新建->HTML文件选项->完成,给你的HTML页面一个名字。在这个例子中,我们将称它为login.html ,。

<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<form action="logInAction" method="post">
<input type="text" name="userName" placeholder="Enter user name" required>
<input type="password" name="uPassword" placeholder="Enter password" required>
<input type="submit" value="login">
</form>
</body>
</html>
第三步:创建过滤器一和'com. demo'包
通过右击Authentication Example ,选择新建->包,创建一个包,最后提供一个你选择的包名。在这种情况下,我们将把它称为com. demo 。
要导航到你上面创建的包,展开src/main/Java 。
在Authentication Example 项目的com. demo 包上点击右键,选择新建->过滤器,最后给你的过滤器类起个名字。在这种情况下,我们将称它为CheckPassword 。

package com. demo;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
@WebFilter("/logInAction")
public class CheckPassword implements Filter
{
public CheckPassword()
{
}
public void destroy()
{
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
HttpServletRequest reg=(HttpServletRequest)request;
PrintWriter out =response.getWriter();
String uPassword=request.getParameter("uPassword");
if(uPassword.length()>7)
{
chain.doFilter(request, response);
}
else
{
out.print("Password characters must be atlist 8");
}
}
public void init(FilterConfig fConfig) throws ServletException
{
}
}
第四步:创建过滤器2
在Authentication Example 项目的com. demo 包上点击右键,选择新建->过滤器,最后给你的过滤器类起个名字。在这种情况下,我们将称它为CheckCredentials 。
package com. demo;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
@WebFilter("/logInAction")
public class CheckCredentials implements Filter
{
public CheckCredentials()
{
}
public void destroy()
{
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
HttpServletRequest reg=(HttpServletRequest)request;
PrintWriter out =response.getWriter();
String userName=request.getParameter("userName");
String uPassword=request.getParameter("uPassword");
if("Africa".equals(userName)&& "12345678".equals(uPassword))
{
chain.doFilter(request, response);
}
else
{
out.print("Wrong credentials");
}
}
public void init(FilterConfig fConfig) throws ServletException
{
}
}
第五步:创建Servlet页面
右键单击Authentication Example 项目中的com. demo 包,选择创建 -> Servlet,并命名你的Servlet类。在这种情况下,我们将称它为AuthenticationDemo ,。
package com.demo;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet({ "/AuthenticationDemo", "/logInAction" })
public class AuthenticationDemo extends HttpServlet
{
private static final long serialVersionUID = 1L;
public AuthenticationDemo()
{
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
PrintWriter out =response.getWriter();
out.print("Welcom");
}
}
在login.html 页面上点击右键。从login.html 页面的上下文菜单中选择运行方式->在服务器上运行->Login.html。要启动该项目,保存所有的修改并重新启动服务器。
在内部浏览器中,将打开一个菜单,邀请你输入我们在CheckCredentials 页面上指定的用户名和密码,如图。
String uPassword=request.getParameter("uPassword");
if("Africa".equals(userName)&& "12345678".equals(uPassword))
{
chain.doFilter(request, response);
}
结语
最后,我们看到了过滤器是如何工作的,它们的功能,使用它们的好处,以及过滤器上的三个界面,即。
- 过滤器
- FilterConfig和
- FilterChain接口。
如果在一个给定的Filter中满足某些条件,用户内容就会被发送到下一个Filter或Servlet;如果不满足,就会返回错误信息。
在我们的例子中,我们使用了两个Filter,一个用于检查密码长度,另一个用于确保用户凭证的准确性。
最后,这篇文章将给你一个坚实的Filter基础。为了提高你的理解和增强你的编码技能,请开始探索更多。