Java Servlet 过滤器
过滤器是请求的预处理和后处理阶段使用的对象,输入验证、服务器端日志记录、身份验证和权限以及其他任务经常使用过滤器进行过滤。
由于 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 固有的可移植性使其非常适合在不同平台(无论类型如何)上部署复杂的服务器扩展。