servlet过滤器与监听器

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 前言Servlet 过滤器和监听器是 Java Web 应用程序中常见的两种组件,它们提供了各种扩展 Web 应用程序功能的方式。总的来说,过滤器和监听器都可以通过 Java Web 应用程序的配置文件或注解进行使用,方便灵活,并可以很好地实现框架与业务逻辑的分离,提高代码可维护性和扩展性。过滤器(Filter)1. 参数验证和转换:可以拦截用户提交的数据,并对数据格式进行验证、修正或转换。2. 访问控制和认证:可以拦截请求并检查用户是否有访问特定资源的权限。3. 日志记录:可以拦截请求并输出相应的日志信息,用于系统运行时的监测与故障排除。4. 资源压缩和解密: 可以拦截响应并对

前言

Servlet 过滤器和监听器是 Java Web 应用程序中常见的两种组件,它们提供了各种扩展 Web 应用程序功能的方式。

总的来说,过滤器和监听器都可以通过 Java Web 应用程序的配置文件或注解进行使用,方便灵活,并可以很好地实现框架与业务逻辑的分离,提高代码可维护性和扩展性。

过滤器(Filter)

  1. 参数验证和转换:可以拦截用户提交的数据,并对数据格式进行验证、修正或转换。
  2. 访问控制和认证:可以拦截请求并检查用户是否有访问特定资源的权限。
  3. 日志记录:可以拦截请求并输出相应的日志信息,用于系统运行时的监测与故障排除。
  4. 资源压缩和解密: 可以拦截响应并对其进行压缩或解密,以提高数据传输效率和安全性。

监听器(Listener)

  1. 生命周期监听:可监听 ServletContext、HttpServletRequest 和 HttpSession 等对象的生命周期事件(如创建、销毁、添加属性、删除属性等)。
  2. 属性变更监听:可监听属性的变化事件,并在发生变化时触发某些业务逻辑。
  3. 请求/响应监听: 可监听 HttpServletRequest 和 HttpServletResponse 对象的事件(如请求到达、请求结束、响应开始、响应结束等),并在发生事件时执行业务逻辑。

过滤器(Filter)代码演示

下面是一个基本的 Servlet 过滤器示例,它拦截所有以 *.do 结尾的请求,输出一些日志信息,并记录请求执行时间:

public class LogFilter implements Filter {
    public void init(FilterConfig config) throws ServletException {
        // 初始化方法,在应用程序启动时调用
    }
    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain) throws IOException, ServletException {
        long startTime = System.currentTimeMillis();
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;
        String uri = req.getRequestURI();
        if (uri.endsWith(".do")) { // 拦截以 .do 结尾的请求
            System.out.println("LogFilter: start handling request " + uri);
        }
        chain.doFilter(request, response); // 调用下一个 filter 或 servlet/jsp 处理请求
        if (uri.endsWith(".do")) {
            System.out.println("LogFilter: end handling request " + uri +
                    ", execution time: " + (System.currentTimeMillis() - startTime) + "ms");
        }
    }
    public void destroy() {
        // 销毁方法,在应用程序停止时调用
    }
}

在 web.xml 中配置 LogFilter:

<filter>
  <filter-name>logFilter</filter-name>
  <filter-class>com.example.LogFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>logFilter</filter-name>
  <url-pattern>/*.do</url-pattern>
</filter-mapping>

这个过滤器会对所有以 .do 结尾的请求进行拦截和处理,并输出一些日志信息和请求执行时间。这个示例演示了过滤器的基本使用方法,开发者还可以根据具体需求实现不同的功能来增强应用程序的性能、安全性等特性。

监听器(Listener)代码演示

以下是一个使用ServletContextListener和ServletRequestListener实现的简单Web应用程序示例,它跟踪并记录用户访问应用程序的次数:

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
@WebListener
    public class VisitorCounterListener implements ServletContextListener, ServletRequestListener {
        private int count; // 用户访问计数器
        public void contextInitialized(ServletContextEvent event) {
            count = 0; // 将计数器设置为0
            // 将计数器保存在ServletContext属性中
            event.getServletContext().setAttribute("visitorCount", count);
        }
        public void requestInitialized(ServletRequestEvent event) {
            count++; // 每当有请求进来,计数器加1
            // 将增加后的计数器再次保存在ServletContext属性中
            event.getServletContext().setAttribute("visitorCount", count);
        }
        // 空实现其他方法(不能省略)
        public void contextDestroyed(ServletContextEvent event) {}
        public void requestDestroyed(ServletRequestEvent event) {}
    }

上面的代码实现了ServletContextListener和ServletRequestListener接口,并用于在应用程序范围内跟踪用户访问计数器。在Servlet初始化期间,将初始计数器值设置为0,并在每个ServletRequest初始化时将其递增。最终,将当前计数器值存储在ServletContext属性"visitorCount"中,以供应用程序中的其他部分检索。

要使用此监听器,请将以下代码添加到web.xml文件中:

<listener>
  <listener-class>com.example.VisitorCounterListener</listener-class>
</listener>
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
2月前
|
JavaScript Java 容器
servlet过滤器Filter简要回顾-过滤请求字符编码,/和/*和/**的区别
本文简要回顾了Servlet过滤器Filter的概念和使用,通过实例演示了如何创建过滤器以过滤请求字符编码,并解释了在web.xml中配置过滤器时使用`/`、`/*`和`/**`的区别。
servlet过滤器Filter简要回顾-过滤请求字符编码,/和/*和/**的区别
|
3月前
|
存储 前端开发 Java
servlet过滤器--使用过滤器统计网站访问人数的计数(注解形式)
该文章展示了如何使用Servlet过滤器(Filter)通过注解方式创建一个网站访问人数统计功能,通过`@WebFilter`注解定义过滤器及其URL模式,并在`doFilter`方法中实现计数逻辑,将访问次数存储在`ServletContext`中,最后在JSP页面展示访问人数。
servlet过滤器--使用过滤器统计网站访问人数的计数(注解形式)
|
3月前
|
C# 数据可视化 开发者
WPF开发者福音:深度解析OxyPlot与LiveCharts图表库,轻松实现数据可视化不再是难题!
【8月更文挑战第31天】在WPF应用中,数据可视化对提升用户体验至关重要。本文介绍并演示了两种流行图表库OxyPlot和LiveCharts的集成与使用方法。OxyPlot是一款适用于.NET应用的开源图表库,提供多种图表类型,易于集成。LiveCharts则以其丰富的图表类型和动画效果,特别适合实时数据展示。通过具体代码示例,本文展示了如何利用这两种图表库创建折线图和柱状图,并详细说明了安装和配置步骤。希望本文能帮助开发者在WPF应用中轻松实现高效、美观的数据可视化。
149 0
|
3月前
|
监控 前端开发 Java
揭秘Web开发神器:Servlet、过滤器、拦截器、监听器如何联手打造无敌博客系统,让你的用户欲罢不能!
【8月更文挑战第24天】在Java Web开发中,Servlet、过滤器(Filter)、拦截器(Interceptor,特指Spring MVC中的)及监听器(Listener)协同工作,实现复杂应用逻辑。以博客系统为例,Servlet处理文章详情请求,过滤器(如LoginFilter)检查登录状态并重定向,Spring MVC拦截器(如LoggingInterceptor)提供细粒度控制(如日志记录),监听器(如SessionListener)监控会话生命周期事件。这些组件共同构建出高效、有序的Web应用程序。
36 0
|
6月前
|
容器
Servlet 教程 之 Servlet 编写过滤器 6
该教程介绍了如何在Servlet中编写过滤器。可以创建多个过滤器,如AuthenFilter和LogFilter,并通过不同的映射进行配置。过滤器的应用顺序由web.xml中filter-mapping的顺序决定,可通过调整顺序改变过滤器执行的先后。
29 3
|
6月前
|
XML 数据格式
Servlet 教程 之 Servlet 编写过滤器 4
在Servlet教程中,学习如何编写过滤器。在`web.xml`配置文件中,创建一个名为`LogFilter`的过滤器,类为`com.baidu.test.LogFilter`,设置初始化参数`Site`为`百度`。将过滤器映射到`/*`,确保所有请求都会经过此过滤器。同时定义了一个名为`DisplayHeader`的Servlet,映射到`/TomcatTest/DisplayHeader`路径。
26 1
|
6月前
|
容器
Servlet 教程 之 Servlet 编写过滤器 7
Servlet教程讲解如何编写过滤器。在`web.xml`中,`&lt;filter&gt;`定义过滤器,`&lt;filter-name&gt;`和`&lt;filter-class&gt;`分别设定名称和类。`&lt;init-param&gt;`配置初始化参数。`&lt;filter-mapping&gt;`指定过滤器作用的资源,可通过`&lt;servlet-name&gt;`或`&lt;url-pattern&gt;`定义。`&lt;dispatcher&gt;`定义过滤器触发时机,如REQUEST、INCLUDE、FORWARD和ERROR,控制过滤器何时拦截资源调用。
32 0
|
3月前
|
缓存 安全 Java
Java服务器端技术:Servlet与JSP的集成与扩展
Java服务器端技术:Servlet与JSP的集成与扩展
31 3
|
3月前
|
存储 缓存 前端开发
Servlet与JSP在Java Web应用中的性能调优策略
Servlet与JSP在Java Web应用中的性能调优策略
30 1
|
3月前
|
存储 Java 关系型数据库
基于Servlet和JSP的Java Web应用开发指南
基于Servlet和JSP的Java Web应用开发指南
36 0