当前位置: 首页 > news >正文

蓝凌EKP产品:JSP 性能优化和 JSTL/EL要点检查列表

Spring Filter 实现 Redis 功能及 JSP 内置对象作用域性能优化

在 Java Web 项目中,我们经常会遇到两类问题:

  1. 使用 Spring Filter 对请求进行拦截,并操作 Redis 实现缓存或限流

  2. JSP 页面中使用内置对象,如果作用域选择不当,会带来性能问题

本文将结合实际开发场景,说明原理、实现方式及优化方法。

一、Spring Filter 如何使用 Bean

一、Spring Filter 实现 Redis 功能

1. 背景

在实际业务中,我们可能需要:

  • 请求限流

  • 用户访问缓存

  • 统计接口调用次数

这些功能通常借助 Redis 来实现。为了拦截所有请求并统一处理,可以使用 Filter

2. 问题

普通 Filter 由 Servlet 容器管理(如 Tomcat),无法直接使用 Spring 容器管理的 Bean(如 RedisTemplate),如果直接 @Autowired 会失败。

3. 解决方式

方案 A:DelegatingFilterProxy(推荐)

Spring 提供 DelegatingFilterProxy,原理如下:

Tomcat FilterRegistry|v
DelegatingFilterProxy|v
Spring 管理的业务 Filter Bean(可以依赖 RedisTemplate)

  • Tomcat 负责调用入口

  • Spring 管理业务 Filter,支持依赖注入

  • 可以安全使用 RedisTemplate、Service 等 Spring Bean

示例:

public class KmssSessionRepositoryFilter extends SessionRepositoryFilter<MapSession> implements ContextLoadedListener {//自行查找蓝凌实现。
}

在 web.xml 或 Spring Boot 配置中注册:

	<!--filter:springSessionRepositoryFilterfilter-name必须是这个,并且在    sys\authentication\spring.xml中有对应的bean--><filter><filter-name>springSessionRepositoryFilter</filter-name><filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class></filter><filter-mapping><filter-name>springSessionRepositoryFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

这样,Filter 就可以安全使用 Redis 功能,同时支持 Spring 注入。

二、为什么 JSP 内置对象作用域会产生性能问题

在 JSP 页面中,我们经常用 <c:set> 设置变量:

<c:set var="canPrint" value="false" scope="page" />

1. JSP 作用域

JSP 支持四种作用域:

Scope生命周期典型用途
page单个页面请求临时变量,渲染当前页面
request单次 HTTP 请求跨 JSP 或 Servlet 传递数据
session用户会话级别用户登录状态、会话数据
application应用级别全局共享数据

2. 性能问题原理

如果临时页面变量使用了 request、session 或 application

  • Request/Session 范围的对象可能需要序列化(尤其在分布式环境中)

  • 大量临时变量占用内存,增加 GC 压力

  • Request 范围中对象过多,会增加每次请求的查找成本

page 作用域的变量:

  • 仅在当前 JSP 页面有效

  • 生命周期短,JSP 渲染完成即释放

  • 无需序列化或跨请求传递

  • 性能最佳

3. 正确示例

<!-- 临时渲染变量,page 作用域 --> <c:set var="canPrint" value="false" scope="page" />

错误示例(会增加性能负担):

<!-- 临时渲染变量却使用 session 作用域 --> <c:set var="canPrint" value="false" scope="session" />

三、结合 Filter 与 JSP 优化说明

在实际项目中,流程通常如下:

  1. Filter 拦截请求 → 使用 Redis 缓存/统计请求

  2. Controller 返回数据 → 转发到 JSP 页面

  3. JSP 渲染页面 → 使用 <c:set> 或其他内置对象

优化点:

  • Filter 负责业务逻辑(如 Redis 功能)

  • JSP 页面只使用 page 作用域存放临时变量

  • 避免把 Filter 逻辑产生的临时数据放入 Session 或 Request,减少内存和序列化压力

原理图:

请求 ---> Filter(DelegatingFilterProxy, Redis操作)
|
v
Controller
|
v
JSP渲染(page作用域临时变量)

EKP 的正确指导实现

1. JSTL 正确写法

推荐写法:
<c:set var="canPrint" value="false" scope="page" />
避免默认作用于 session 导致 Redis 写入。

2. 容器对象提前声明

<%
if (request.getAttribute("nodeAdditionalMap") == null) {pageContext.setAttribute("nodeAdditionalMap", new HashMap());
}
%>
//防止 xxx.abc 触发全类扫描。

pageContext.removeAttribute 显式 scope

pageContext.removeAttribute("canPrint", PageContext.PAGE_SCOPE);
防止错误地修改 session。

四、总结EL 容器对象提前声明

  1. Spring Filter + Redis

    • 使用 DelegatingFilterProxySpringBeanUtils.getBean() 获取 Spring Bean

    • Filter 本身由 Tomcat 管理,但业务逻辑由 Spring 管理

    • 支持 Redis 缓存、限流、统计等功能

  2. JSP 内置对象作用域优化

    • 临时页面变量使用 page 作用域

    • 避免使用 request/session/application 存储短期临时数据

    • 提升性能,降低内存压力

http://www.dtcms.com/a/335430.html

相关文章:

  • Trae 辅助下的 uni-app 跨端小程序工程化开发实践分享
  • Docker之自定义jkd镜像上传阿里云
  • Spring AI 集成阿里云百炼平台
  • vscode无法检测到typescript环境解决办法
  • SpringCloud 03 负载均衡
  • 向量数据库基础和实践 (Faiss)
  • QT 基础聊天应用项目文档
  • Flutter vs Pygame 桌面应用开发对比分析
  • Android原生(Kotlin)与Flutter混合开发 - 设备控制与状态同步解决方案
  • 安卓开发者自学鸿蒙开发2页面高级技巧
  • 第一阶段总结:你的第一个3D网页
  • 【牛客刷题】成绩统计与发短信问题详解
  • OpenMemory MCP发布!AI记忆本地共享,Claude、Cursor一键同步效率翻倍!
  • 【FreeRTOS】刨根问底6: 应该如何防止任务栈溢出?
  • JavaScript性能优化实战(四):资源加载优化
  • FreeRTOS源码分析八:timer管理(一)
  • Hunyuan-GameCraft:基于混合历史条件的高动态交互游戏视频生成
  • 健身房预约系统SSM+Mybatis实现(三、校验 +页面完善+头像上传)
  • 基于Node.js+Express的电商管理平台的设计与实现/基于vue的网上购物商城的设计与实现/基于Node.js+Express的在线销售系统
  • Visual Studio Code 基础设置指南
  • iSCSI服务配置全指南(含服务器与客户端)
  • 12.web api 3
  • Docker入门:容器化技术的第一堂课
  • Chrome插件开发实战:todoList 插件
  • IP 分片和组装的具体过程
  • 二分查找(Binary Search)
  • 力扣刷题904——水果成篮
  • Java开发MCP服务器
  • 云计算-K8s 实战:Pod、安全上下文、HPA 、CRD、网络策略、亲和性等功能配置实操指南
  • 大模型提示词(Prompt)终极指南:从原理到实战,让AI输出质量提升300%