Java Servlet 过滤器


在请求的预处理和后处理阶段都使用的对象是过滤器,输入验证、服务器端日志记录、身份验证和权限等任务通常使用过滤器进行过滤。

由于 servlet 是可插拔的,因此条目在 web.xml 文件中提供。如果从 web.xml 文件中删除该条目,则过滤器将自动禁用。为了创建过滤器,它必须实现 javax.servlet。Servlet 非常便携,因为它们是用高度便携的 Java 语言构建的,并遵循标准基础。因此,它使得能够在彼此独立的操作系统和服务器中开发复杂的服务器扩展。

为什么我们需要 Servlet 过滤器?

Servlet 过滤器有很多功能。下面列出了一些功能:

  • 服务器上的日志记录

  • 日志文件记录请求参数信息

  • 服务器上的身份验证和授权

  • 文件压缩和解压缩

  • 加密和解密都是不同的过程

  • 服务器上的验证

Servlet 过滤器的优点

以下是 Servlet 过滤器的功能:

  • 可以插入

  • 过滤器不依赖于第三方资源

  • 维护成本低

  • 广泛使用

Servlet 过滤器方法

它包含 3 个生命周期方法

方法

描述

public void init(FilterConfig config) throws ServletException

为了通知正在投入服务的过滤器,这激活了 Web 容器。它只需要 FilterConfig 类型或 FilterConfig 对象作为参数。

public void doFilters(ServletRequest request,ServletResponse response,FileterChain chain) throws ServletException,IOException

每次用户请求映射到过滤器的资源时,都会调用 dofilter() 方法。它具有过滤功能。

public void destroy ()

此函数仅在过滤器从服务中移除时才调用一次。

示例

在本例中,我们将创建一个名为 index.html 的网页,其中包含一个链接,上面写着“点击此处”。通过点击链接来调用 servlet “ServletFilter.java”,但是,与该 Servlet 关联的部署描述符中指定的过滤器“MyFilter.java”将首先执行。

Index.html

示例

<html>
   <head>
      <title>HttpSession Event Listeners</title>
   </head>
   <body>
      <a href="ServletFilter">click here</a>
   </body>
</html>

ServletFilter.java

示例

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.*;
public class ServletFilter extends HttpServlet {
   public void doGet(HttpServletRequest request,
      HttpServletResponse response)
      throws ServletException, IOException {
         response.setContentType("text/html");
         PrintWriter out = response.getWriter();
         out.print(
            "<br>welcome to servlet filter example<br>");
      }
}

MyFilter.java

示例

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.*;
public class MyFilter implements Filter {
   FilterConfig config;
   public void init(FilterConfig config)
      throws ServletException {
      this.config = config;
   }
   public void doFilter(ServletRequest req,
                        ServletResponse resp,
                        FilterChain chain)
   throws IOException, ServletException {
      PrintWriter out = resp.getWriter();
      String s = config.getInitParameter("construction");
      if (s.equals("yes")) {
         out.print("This page is under construction");
      } else {
         // sends request to next resource
         chain.doFilter(req, resp);
      }
   }
   public void destroy() {}
}

Web.xml

示例

<?xml version="1.0" encoding="UTF-8"?>
<web-app
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns="http://xmlns.jcp.org/xml/ns/javaee"
   xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
   http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
   id="WebApp_ID" version="4.0">
   <servlet>
      <servlet-name>ServletFilter</servlet-name>
      <servlet-class>ServletFilter</servlet-class>
   </servlet>
   <servlet-mapping>
      <servlet-name>ServletFilter</servlet-name>
      <url-pattern>/ServletFilter</url-pattern>
   </servlet-mapping>
   <filter>
      <filter-name>f1</filter-name>
      <filter-class>MyFilter</filter-class>
      <init-param>
         <param-name>construction</param-name>
         <param-value>no</param-value>
      </init-param>
   </filter>
   <filter-mapping>
      <filter-name>f1</filter-name>
      <url-pattern>/servlet1</url-pattern>
   </filter-mapping>
</web-app>

输出

  • 步骤 1 - 点击“点击此处”

  • 步骤 2 - 如果点击以下链接,将弹出此消息

结论

在请求处理领域,过滤器是必不可少的组件,在请求处理之前和之后都发挥着重要作用。重要的是,过滤器被广泛用于各种任务,包括但不限于验证用户输入;记录服务器端活动;提供身份验证或授权服务。在 servlet 技术的上下文中,由于它是可插拔的,因此可以通过适当地配置 web.xml 文件来优雅地引入过滤器。如果出于任何原因需要快速禁用此文件中与这些过滤器相关的任何条目,则删除将立即产生这种效果。为了让开发人员能够在此技术框架内创建过滤器并享受其在不同情况和不同服务器环境中的可移植性优势;javavax.servlet 实现至关重要,因为它是其唯一的构建块。不用说,与其他具有某种程度的兼容性问题的类似技术(可能由于编程语言差异等原因)不同。servlet 中固有的可移植性使它们非常适合跨各种平台部署复杂的服务器扩展,而不管类型如何。

更新于: 2023年8月1日

652 次浏览

启动您的 职业生涯

通过完成课程获得认证

开始学习
广告