学习小程序过滤器API

110 阅读8分钟

Servlet过滤器API

过滤器是一个用于执行过滤操作的对象,例如转换、记录、压缩、加密和解密、输入验证等等。当一个应用程序被预处理和后处理时,被调用的对象被过滤。

过滤器是配置的,在执行过滤活动时使用。过滤器的接口可以在javax.servlet package

要创建一个过滤器类,我们必须导入javax. servlet 并实现过滤器接口。根据用户和开发者的要求,可以创建几个过滤器来执行不同的任务。

目标

阅读本文后,读者应该能够理解以下内容。

  1. 一个servlet过滤器的定义。
  2. 使用过滤器的好处。
  3. 过滤器的接口,如Filter 接口、FilterConfing 接口和其他接口。
  4. 与上述接口相关的方法以及它们的功能。
  5. 利用实例,学习如何在计算机程序中使用过滤器。

先决条件

你将需要以下工具来学习本文的内容。

  • 在你的机器上应安装Eclipse或其他开源的Java编辑器。
  • 安装一个网络浏览器。
  • 安装TomCat服务器或任何其他服务器。在这种情况下,我们将使用TomCat版本9。
  • 对Java编程语言有基本的了解。
  • 需要对servlet有一个基本的了解。
  • 具备使用任何Java IDE、Tomcat或类似服务器构建和运行Java代码的坚实知识。

什么是Servlet过滤器,它们是如何工作的

Servlet过滤器的定义

过滤器是执行和定制过滤操作的Java类,它通过以下方式完成。

  • 在客户端请求到达后端资源之前拦截它们
  • 在将服务器响应发回给客户端之前,改变服务器响应。

Servlet过滤器如何工作

How Filter works

解释一下。

  • 当一个请求进入Web容器时,它被检查是否有过滤器的URL模式与传入的URL相匹配。
  • WebContainer 将请求发送到具有匹配URL模式的第一个过滤器,以执行其功能。

然后,第一个过滤器检查是否有第二个Filter ,有匹配的URL,该过滤器的代码被运行,这将持续到没有找到更多的URL模式匹配的过滤器。

如果没有错误,请求就被转发到目标Servlet。因此,我们知道,只有在成功完成所有相关的Filter之后,请求才会被传递到目的地Servlet。

Servlet将响应返回给调用者,然后将响应传递给Web容器,后者再将其传递给客户端。

过滤器的使用及其优点

过滤器在以下领域使用。

  • 验证。
  • 图像转换。
  • 数据的压缩。
  • 加密。
  • 审计和记录,仅举几例。

过滤器的用途

根据上面提到的应用领域,我们可以得出过滤器的以下用法。

  • 压缩数据。
  • 追踪所有入站请求。
  • 协助激活资源访问事件。
  • 用于数据的加密和解密。
  • 用于输入的验证。
  • 转换。

优点是

  • 过滤器可以被改变或用不同的过滤器替换。在这种情况下,过滤器是可插拔的。
  • 其中一个过滤器不需要依赖另一个资源。
  • 过滤器需要较少的维护。

过滤器的API

servlet过滤器有其API,即。Filter、FilterChain和FilterConfig,解释如下。

过滤器

我们必须实现Servlet的 "过滤器 "接口,这是javax. servlet 包的一部分,以创建一个过滤器。

创建一个过滤器

下面的步骤是创建一个Filter程序。

  1. 创建一个实现接口的Java类Filter
  2. 设置过滤器的参数。
  3. 最后,做一个过滤器的映射。

方法

  • void init():init() 方法初始化了过滤器参数;它通知Web容器需要激活一个过滤器。只需要一个参数,即。
public void init(FilterConfig parameterName) throws ServletException
  • void doFilters():这个方法是Filter接口中最重要的,它调用下一个过滤器。

它需要三个参数。

  1. ServletRequest obj
  2. ServletResponse obj
  3. 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接口中,有四个方法。

  1. void init():这个方法只被调用一次,用于设置过滤器。
  2. String getInitParameter:提供的参数名的参数值由该方法返回。
  3. getInitParameterNames():该方法返回所有类型枚举参数名称的列表。
  4. getServletContext():该方法返回ServletContext 对象。

使用过滤器进行认证的例子

这个例子演示了如何使用Filter来实现验证。我们在这里使用两个过滤器:一个用来验证密码是否超过七个字符,另一个用来检查用户提供的用户名和密码。

如果密码长度正确,过滤器1将把请求转发给第二个过滤器。否则,将出现一个错误通知。

如果用户名和密码正确,第二个过滤器将把请求转发到Servlet页面;否则,将显示一个错误信息。

创建认证实例的步骤

我们假设你已经知道如何使用eclipse IDE并在本例中配置Tomcat服务器。

第一步:认证示例--动态网页项目

打开用于Java EE开发人员的Eclipse IDE。通过选择Files -> New -> Dynamic Web Project创建一个Web项目,并提供一个项目名称。我们将其命名为Authentication Example ,->选择Finish

Authentication Example Project

第二步:创建一个登录的HTML页面

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

login page

<!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

CheckPassword lenght Filter

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);
        }

结语

最后,我们看到了过滤器是如何工作的,它们的功能,使用它们的好处,以及过滤器上的三个界面,即。

  1. 过滤器
  2. FilterConfig和
  3. FilterChain接口。

如果在一个给定的Filter中满足某些条件,用户内容就会被发送到下一个Filter或Servlet;如果不满足,就会返回错误信息。

在我们的例子中,我们使用了两个Filter,一个用于检查密码长度,另一个用于确保用户凭证的准确性。

最后,这篇文章将给你一个坚实的Filter基础。为了提高你的理解和增强你的编码技能,请开始探索更多。