Java Servlet 过滤器

javaobject oriented programmingprogramming更新于 2024/8/7 23:13:00

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

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

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

我们拥有 Servlet 过滤器的许多功能。下面提到了其中一些:

  • 服务器上的日志记录

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

  • 在服务器上,进行身份验证和授权

  • 文件的压缩和解压

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

  • 服务器上的验证

Servlet Filter 的优点

以下是 Servlet Filter 的功能:

  • 可以插入

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

  • 几乎不需要维护

  • 广泛使用

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 固有的可移植性使其非常适合在不同平台(无论类型如何)上部署复杂的服务器扩展。


相关文章