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的网页,其中包含一个标有“点击这里”的链接。通过点击此链接,将调用名为“ServletFilter.java”的servlet,然而,与此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
Example
<?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具有可移植性,使其成为在各种类型的平台上部署复杂服务器扩展的理想选择。