游乐游手机版
首页/AI教程/文章详情

JavaWeb初识ServletContext全局对象及过滤器和监听器使用详解

时间:2026-06-06 16:44
ServletContext作为应用级全局共享对象,可获取真实路径、工程路径并存取属性。过滤器拦截资源访问,实现权限验证、编码处理等预处理。监听器监控Session的创建、销毁及属性增删改事件,用于资源初始化与清理。

首先来了解 ServletContext 这个全局作用域对象。它相当于整个 Web 应用程序的“总管”,所有 Servlet 共享同一个实例。观察下方示意图,可以快速建立直观认知——

ja vaWeb初识 ServletContext全局对象,过滤器,监听器

编程实现非常简洁:只需调用 this.getServletContext() 即可获取该对象。获取后能做什么?可以获取服务器上的真实路径、上下文路径,还能存取全局属性数据,功能全面。以下代码展示了这些常见操作:

import ja vax.servlet.ServletConfig;
import ja vax.servlet.ServletContext;
import ja vax.servlet.ServletException;
import ja vax.servlet.annotation.WebServlet;
import ja vax.servlet.http.HttpServlet;
import ja vax.servlet.http.HttpServletRequest;
import ja vax.servlet.http.HttpServletResponse;
import ja vax.servlet.http.HttpSession;
import ja va.io.IOException;

public class HelloServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletConfig config = this.getServletConfig(); // 创建ServletConfig对象
        System.out.println(config.getInitParameter("className"));
        System.out.println(config.getInitParameter("url"));

        ServletContext servletContext = this.getServletContext();
        // servletContext.getAttribute()           // 通过name取属性值
        // servletContext.setAttribute();          // 添加键值对
        // servletContext.removeAttribute();       // 删除属性
        // servletContext.getAttributeNames();      // 获取所有属性名称

        System.out.println("servletContext.getRealPath(\"/WEB-INF\") = " + servletContext.getRealPath("/WEB-INF")); // 绝对路径
        System.out.println("servletContext.getContextPath() = " + servletContext.getContextPath()); // 工程路径(root下为空)

        // 多种方式获取ServletContext
        // this.getServletConfig().getServletContext()
        // this.getServletContext()
        // req.getServletContext()
        // req.getSession().getServletContext()
    }
}

过滤器:资源访问的必经关卡

过滤器会在任何资源被请求之前执行,非常适合进行全局性的前置处理。常见应用场景如下:

  • 数据库加载
  • 权限验证
  • 数据检查
  • 数据加工
  • 数据缓存

来看一下基本实现方式:过滤器需要实现 Filter 接口,并在 doFilter 方法中编写处理逻辑,通过调用 filterChain.doFilter() 放行请求。例如下方代码,仅当请求的 URL 以 .jpg 结尾时才允许继续访问:

import ja vax.servlet.*;
import ja vax.servlet.annotation.WebFilter;
import ja vax.servlet.http.HttpServlet;
import ja vax.servlet.http.HttpServletRequest;
import ja vax.servlet.http.HttpServletResponse;
import ja va.io.IOException;

//@WebFilter("*")
public class AFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {}

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        if (request.getRequestURL().toString().endsWith(".jpg")) {
            // 判断条件满足,放行
            filterChain.doFilter(servletRequest, servletResponse);
        }
    }

    @Override
    public void destroy() {}
}

监听器:实时监测 Session 的创建与属性变化

监听器的核心功能是监控 Session 对象的创建、销毁以及属性的添加、移除和替换操作。实现起来也很直观:实现相应接口,重写方法即可。以下示例实现了 HttpSessionIdListenerHttpSessionListenerHttpSessionAttributeListener 接口,可以将 Session 中的各类事件信息输出到控制台:

@WebListener
public class SessionListener implements HttpSessionIdListener, HttpSessionListener, HttpSessionAttributeListener {

    public void sessionIdChanged(HttpSessionEvent var1, String var2) {
        System.out.println("sessionIdChanged..");
    }

    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
        System.out.println("sessionCreated..");
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        System.out.println("sessionDestroyed..");
    }

    @Override
    public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("attributeAdded..");
    }

    @Override
    public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("attributeRemoved..");
    }

    @Override
    public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("attributeReplaced..");
    }
}
来源:https://developer.aliyun.com/article/704523
上一篇AI代码假绿灯?反向测试逼它自证清白 下一篇Spring中日志相关对象的创建流程
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
Synthesia零基础教程:客户端安装与工作区权限设置
AI教程 · 2026-06-07

Synthesia零基础教程:客户端安装与工作区权限设置

本文介绍了AI视频生成工具Synthesia的入门流程。内容涵盖从官网下载客户端、完成账户注册与登录,到软件安装与启动的完整步骤。详细说明了如何初始化工作区,包括创建首个AI视频项目、选择模板与AI主播。最后,指导用户理解并设置团队协作中的不同权限角色,以便安全高效地共同管理项目。

FramePack新手入门指南:安装启动报错修复导出全流程
AI教程 · 2026-06-07

FramePack新手入门指南:安装启动报错修复导出全流程

本文详细介绍了FramePack工具从下载安装到项目导出的完整流程。内容涵盖软件安装步骤、首次启动设置、常见报错解决方案以及项目打包导出方法。指南旨在帮助用户快速掌握工具核心操作,解决使用过程中可能遇到的技术问题,确保顺利完成AI视频帧处理任务。

FLUX.1保姆级教程:环境安装、显存优化与首次出图测试
AI教程 · 2026-06-07

FLUX.1保姆级教程:环境安装、显存优化与首次出图测试

本文详细介绍了FLUX 1的安装与初步使用流程。内容涵盖从Python环境配置、代码仓库克隆、依赖包安装,到关键的显存优化设置,最后指导用户完成首次文生图测试。教程旨在帮助用户顺利搭建运行环境,解决常见安装问题,并实现基础图像生成功能。

AnythingLLM新手实战:本地大模型部署后知识库接入设置
AI教程 · 2026-06-07

AnythingLLM新手实战:本地大模型部署后知识库接入设置

本文介绍了在本地部署大模型后,如何为AnythingLLM设置知识库。内容涵盖知识库的基本概念、创建与配置步骤、文档上传与处理技巧,以及如何通过问答测试其效果。旨在帮助用户有效整合本地文档资源,构建个性化的AI知识助手,提升信息检索与利用效率。

Aider安装失败排查:扩展冲突与登录异常全解析
AI教程 · 2026-06-07

Aider安装失败排查:扩展冲突与登录异常全解析

本文针对Aider安装过程中常见的扩展冲突与登录异常问题,提供了系统的排查思路与解决方案。内容涵盖如何识别并处理与其他AI工具的兼容性问题,解决因网络或账户设置导致的登录失败,以及通过环境检查、依赖更新等步骤彻底排除安装障碍,帮助用户顺利完成安装与配置。