JSP避免Form重复提交的三种方案
JavaScript及Struts在防止网页重复提交方面的应用
一、利用JavaScript实现防止重复提交
在Web应用中,我们经常需要确保表单只被提交一次。通过JavaScript,我们可以设置一个变量来跟踪提交状态。具体实现如下:
```javascript
var checkSubmitFlg = false; // 初始化提交标志为false
function checkSubmit() {
if (checkSubmitFlg) { // 如果已经提交过,直接返回false
return false;
}
checkSubmitFlg = true; // 设置已提交标志
return true; // 允许表单提交
}
document.ondblclick = function docondblclick() {
window.event.preventDefault(); // 阻止双击事件默认行为
}
document.onclick = function doconclick() {
if (checkSubmitFlg) { // 如果已经提交过,阻止点击事件的默认行为
window.event.preventDefault();
}
}
```
在HTML表单中使用上述的`checkSubmit`函数,即可实现只允许提交一次的功能。
二、使用JavaScript禁用提交按钮或图片
除了上述方法,我们还可以直接禁用提交按钮或图片来防止重复提交。示例如下:
```html
function disableSubmitButton() {
document.getElementById('submitInput').disabled = true; // 禁用提交按钮或图片
}
```
三、利用Struts的同步令牌机制防止重复提交
为了解决Web应用中的重复提交问题,Struts提供了同步令牌(Token)机制。服务器端在处理请求前,会检查请求中的令牌是否与保存在用户会话中的令牌匹配。若不匹配,则说明是重复提交。
基本原理如下:
1. 服务器端在处理请求前,验证令牌是否有效。
2. 若令牌有效,处理请求;若无效,保存新令牌并引导用户重新提交。
Struts根据用户会话ID和当前系统时间生成唯一令牌。具体实现可以参考TokenProcessor类中的generateToken()方法。通过这种方式,可以有效防止用户回退到之前的提交页面并再次提交导致的重复提交问题。
示例代码片段:
```java
if (isTokenValid(request, true)) {
// 你的代码逻辑在这里
return mapping.findForward("success");
} else {
saveToken(request); // 保存新令牌
return mapping.findForward("submitAgain"); // 引导用户重新提交
}
```
在网页开发中,事务控制令牌是一个重要的机制,用于防止表单的重复提交。在构建一个基于Struts框架的Web应用时,每一个会话(session)都会自动生成一个独特的事务控制令牌。这个令牌会被存储在一个隐藏的表单字段中,用户无法直接看到。当用户尝试提交表单时,后台会验证这个令牌的合法性。
具体的实现过程是这样的:在HTML表单中,有一个隐藏的输入字段,这个字段是由Struts标签库自动生成的,它的名字通常是“.apache.struts.taglib.html.TOKEN”。这个字段的值是一个由会话ID和当前时间戳通过MD5算法生成的令牌。当用户提交表单时,服务器会检查这个令牌是否有效。
如果令牌无效,服务器会记录一个全局错误,并重置令牌。这样的机制可以有效地防止表单的重复提交。例如,如果用户因为某种原因(如网络延迟)多次点击了提交按钮,由于令牌的有效性检查,只有第一次提交会被处理,其他的都会被忽略。
在后台代码中,有一个方法用于生成这个令牌。这个方法接收一个HTTP请求作为参数,从请求中获取会话对象,并尝试获取会话ID和当前时间戳。然后,它使用MD5算法对这两个值进行哈希处理,生成一个独特的令牌。这个方法还处理了一些可能的异常,如“IllegalStateException”和“NoSuchAlgorithmException”,在这些情况下,它会返回null。
这种基于会话的事务控制令牌机制确保了Web应用的数据安全性和稳定性。它避免了因为重复提交导致的潜在问题,提升了用户体验,是Web开发中不可或缺的一部分。
编程语言
- JSP避免Form重复提交的三种方案
- JavaScript代码生成PDF文件的方法
- MySQL开启慢查询日志功能的方法
- Vue手把手教你撸一个 beforeEnter 钩子函数
- Angularjs 自定义服务的三种方式(推荐)
- jQuery遍历DOM元素与节点方法详解
- SQL SERVER 自增列
- Javascript实现快速排序(Quicksort)的算法详解
- 学习PHP Cookie处理函数
- 基于Vue实现页面切换左右滑动效果
- 解决vue数组中对象属性变化页面不渲染问题
- JavaScript优化专题之Loading and Execution加载和运行
- CI框架无限级分类+递归的实现代码
- jQuery实现按钮点击遮罩加载及处理完后恢复的效
- TypeScript Type Innference(类型判断)
- Vue开发之封装分页组件与使用示例