0%

Java Web 表单重复提交问题:原因分析与解决方案

表单重复提交是 Web 开发中常见的问题,可能导致数据重复入库、订单重复创建等严重后果。本文将详细分析重复提交的场景、成因,并提供基于 Session 的解决方案,确保表单数据仅被处理一次。

表单重复提交的常见场景

1. 场景一:提交后刷新响应页面

  • 操作流程:用户提交表单 → 服务器通过 request.getRequestDispatcher().forward() 转发到结果页 → 用户刷新结果页。
  • 原因:刷新时浏览器会重新发送最后一次请求(即表单提交请求),而地址栏仍显示 Servlet 路径,导致重复提交。

2. 场景二:快速重复点击提交按钮

  • 操作流程:用户在短时间内多次点击 “提交” 按钮。
  • 原因:服务器尚未处理完第一次请求,第二次请求已到达,导致重复处理。

3. 场景三:后退后再次提交

  • 操作流程:用户提交表单 → 点击浏览器 “后退” 按钮 → 再次点击 “提交” 按钮。
  • 原因:后退后表单数据仍保存在浏览器中,再次提交会重新发送相同请求。

注意:不属于重复提交的情况

点击 “后退”→ 刷新页面 → 再次提交,不属于重复提交。因为刷新页面会重新加载表单页,此时提交的是新的请求(原表单数据可能已清空或重新生成)。

解决方案:基于 Session 的令牌验证机制

核心思路是生成唯一令牌(Token),通过 Session 跟踪令牌状态,确保每个表单请求仅被处理一次。

实现步骤:

阅读全文 »

Hibernate NonUniqueObjectException 异常深度解析:原因、解决方案与最佳实践

org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session 是 Hibernate 开发中常见的缓存与对象状态冲突异常,核心原因是同一 Session 的一级缓存中,存在两个 OID(主键)相同但内存地址不同的持久化对象,导致 Hibernate 无法判断哪个对象的状态应同步到数据库。本文将从异常根源、复现场景、解决方案及预防措施四个维度,彻底解决该异常。

异常核心原因:Session 缓存的 OID 唯一性约束

Hibernate 一级缓存(Session 缓存)有一个核心规则:同一 Session 中,数据库表的每条记录(对应唯一 OID)只能对应一个持久化对象实例

当出现以下情况时,会触发该异常:

  1. Session 缓存中已存在 OID 为 X 的对象 A(持久化状态);
  2. 程序试图将另一个 OID 也为 X 的对象 B(可能是游离状态或新创建的对象)纳入该 Session 管理(如执行 update()saveOrUpdate()merge() 等操作);
  3. Hibernate 检测到 AB 的 OID 相同但内存地址不同,无法确定以哪个对象的状态同步数据库,从而抛出 NonUniqueObjectException

异常复现场景:常见触发案例

通过具体代码场景复现异常,帮助理解问题本质。

场景 1:重复加载同一 OID 对象后执行更新

阅读全文 »

Tomcat 部署残留问题解决方案:彻底清理旧项目配置

在 Tomcat 部署项目时,有时会遇到 “新项目无法正常启动”“访问路径冲突”“类加载异常” 等问题,这往往是由于旧项目残留配置或文件未清理干净导致的。本文将详细介绍 Tomcat 中可能残留项目的位置及彻底清理的步骤,确保新项目正常部署。

残留文件 / 配置的常见位置

Tomcat 部署项目后,会在多个目录生成缓存文件或配置,旧项目的残留主要集中在以下位置:

webapps 目录:项目部署文件

webapps 是 Tomcat 默认的应用部署目录,若旧项目未彻底删除,可能导致:

  • 路径冲突(如旧项目与新项目上下文路径相同);
  • 类文件残留(导致类加载异常)。

清理步骤

  • 进入 Tomcat 安装目录下的 webapps 文件夹;
  • 删除所有无关的旧项目文件夹(如 oldappdemo 等);
  • 若使用 WAR 包部署,同时删除对应的 .war 文件(避免 Tomcat 自动重新部署)。

work 目录:编译缓存文件

Tomcat 会将 JSP 编译为 Servlet(.class 文件),并在 work 目录中缓存,旧项目的缓存可能导致:

阅读全文 »

测试页面,无需关心

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

阅读全文 »