在页面中使用WebWork的token标签解决表单重复提交问题
王保政
我们的项目是基于Struts开发的,在设计时没有考虑重复提交的问题,所以用户在点击页面的提交,然后在下一个浏览器页面点后退,或者点提交时没跳转到新页面,在当前页面多次点击提交按钮,这两种情况都会产生重复提交的问题,例如用户基本信息维护的新增页面,点两次保存会向数据库提交两次,这时数据库中会新增两条记录。
后来我们引入了Webwork框架(项目的主框架仍然是基于struts的,只是将webwork配置到当前项目中,就可以使用webwork的token标签),通过Webwork的token标签解决了这个问题(当然不是必须引入webwork才能解决,而是webwork提供了现成的token标签供我们使用),下面是引入了webwork的token标签的JSP代码:
<%@ taglib uri="webwork" prefix="ww" %>
<html>
<head></head>
<body>
Please enter your 姓名:
<form action="helloWorld.action">
<ww:token name="UserInfo.token"/>
<input type="textfield" name="name" />
<input type="submit"/>
</form>
</body>
</html>
<%
String s = (String)session.getAttribute("UserInfo.token");
if(s!=null){
System.out.println(s);
}
%>
其中UserInfo.token是我们为当前表单的token定义了一个名字,不同的表单可以定义不同的token名。
访问此JSP,在浏览器中查看此JSP生成的html代码:
<html>
<head></head>
<body>
Please enter your 姓名:
<form action="helloWorld.action">
<input type="hidden" name="webwork.token.name" value="UserInfo.token"/>
<input type="hidden" name="UserInfo.token" value="8QXRRY5TI9CVRZO29VCZ6LQDOOEXF4NB"/>
<input type="textfield" name="name" />
<input type="hidden" name="operate" value="updateUser" />
<input type="submit"/>
</form>
</body>
</html>
可以看到webwork在表单中生成了一个webwork.token.name和UserInfo.token的隐藏列,webwork除了生成了隐藏列外,还将token值写入到了session中的UserInfo.token变量。
在录入页面中生成了token之后,在struts的控制层如何控制表单不重复提交?见下面的控制层的代码:
try
{
String requestToken = request.getParameter("UserInfo.token");
String sessionToken = (String)session.getAttribute("UserInfo.token"); //JSP中直接使用//session,在Struts的action类中用request.getSession()获取Session。
System.out.println("请求中的token为:");
System.out.println(requestToken);
if(sessionToken.equals(requestToken))
{
System.out.println("1:token值相同,下面处理正常业务,并删除Session中的token!!");
session.setAttribute("UserInfo.token","0"); //也可以直接removeAttribute,这样在异常里//提示session中的token为空,不能重复操作!设为0等同于清空,因为生成的token肯定不//是0,这样做是为了不抛出异常。
//session.removeAttribute(“UserInfo.token”);
}
else
{
System.out.println("2:token值不同,为重复提交!!");
}
}
catch(Exception ex)
{
System.out.println("session中的token被删除,为重复提交!");
}
用token防止重复提交的大致思路是这样的:
(1) 在开始访问一个页面时Webwork新建了一个token隐藏字段,另外将token写入到session中,例如上面的UserInfo.token字段和session中的UserIno.token字段,在一开始访问用户录入页面时,两个值相等。
(2) 在录入页面点提交,然后控制层的类就开始判断request参数中的UserInfo.token(对应的UserInfo.token隐藏字段)和session中的UserInfo.token的值是否相等,如果相等,则说明是第一次访问,可以提交,但处理完业务后,要将此token清空。
(3) 如果是录入页面通过后退或重复点击进行保存的操作,因为这两种情况都不会再次在Session中生成UserInfo.token值(此值已在处理完业务后被清空),所以控制层根据session中的此值为空或不等于request中的token值来判断是否为重复提交。
Webwork可以在控制层配置TokenInterceptor,可以不需要将token控制代码写到Action类中。以上实现方案供大家参考,在项目中如果需要用这种方式防止重复提交,实际上只需要在form中添加<ww:token name=”yourformtokenname”/>,并将控制层的防止重复提交的代码封装到Action基础类,如果使用webwork框架,直接为action配置TokenInterceptor就可以了。
分享到:
相关推荐
WebWork WW标签库是专门为WebWork框架设计的一组自定义标签,用于在JSP页面上进行动态数据展示、控制流操作和表单元素渲染。WW标签库提供了丰富的标签,例如`<ww:if>`、`<ww:iterator>`、`<ww:set>`、`<ww:property>...
- **重构模板**:在模板中使用条件语句控制错误消息的显示,避免重复渲染。 - **修复Action错误处理**:确保在Action完成后清理错误信息,避免旧错误积累。 - **调整拦截器配置**:根据需要调整Interceptor配置,...
WebWork 是一款基于 Java 的 MVC(Model-View-Controller)框架,它提供了强大的标签库来简化JSP页面的开发。这些标签使得开发者能够更高效地处理业务逻辑、数据展示和用户交互。以下是对WebWork标签的详细介绍: 1...
WebWork UI标签是一种用于构建Web应用程序用户界面的组件,它提供了丰富的功能,使得开发者能够更加便捷地创建交互式的Web页面。WebWork是一个不绑定特定视图技术的框架,支持多种模板语言,如JSP、Velocity和...
WebWork是一个基于Java的MVC(Model-View-Controller)框架,它提供了强大的标签库来帮助开发者在JSP页面上更高效地构建动态Web应用程序。WebWork标签库分为多个类别,包括通用标签、组件化标签、流程控制标签、迭代...
**范例**:为了访问存储在`session`中的`User`对象的多个字段,可以通过重复使用`#session[‘user’]`,但更高效的做法是使用`set`标签定义一个临时变量,从而减少代码冗余。 ##### push标签:值栈管理的高级工具 ...
Webwork标签库CHM是一个关于WebWork框架中标签库的参考文档,主要涵盖了WebWork框架中用于构建动态网页的自定义标签的相关知识。WebWork是一个Java Web开发框架,它简化了MVC(模型-视图-控制器)模式的实现,提高了...
chm格式的webwork标签帮助文档,英文的
此标签常用于在JSP页面中显示模型数据。 - **`<ww:push/>`**:将一个值推入当前作用域的栈中。常用于需要在一个局部范围内改变变量值的场景。 - **`<ww:param/>`**:设置参数值。通常用于传递参数给其他标签或...
7. **标签库**:WebWork 自带一套丰富的标签库,可以方便地在JSP页面中使用,减少硬编码,提高开发效率。 8. **持久化支持**:WebWork 可以与各种持久化框架如Hibernate、iBatis等集成,方便进行数据库操作。 9. *...
接下来,我们需要在WebWork视图层的JSP页面中使用`datepicker`标签。WebWork标签库提供了一个`ww:datepicker`标签,它允许我们方便地与jQuery UI的Datepicker集成。下面是一个简单的例子: ```jsp ...
在本例中,我们关注的是使用WebWork框架在Java环境中实现文件上传。WebWork是一个轻量级的MVC(Model-View-Controller)框架,它提供了处理HTTP请求和响应的强大工具,包括文件上传。 首先,我们需要了解WebWork的...
webwork2.17中文使用手册
这允许在 JSP 页面中使用 WebWork 的标签,如 `<s:form>`、`<s:textfield>` 等。 3. **welcome-file-list**:定义了当用户访问目录而不是具体文件时,服务器应该显示的默认欢迎页面。在这个例子中,如果用户访问...
在IT行业中,WebWork是一个基于Java的MVC(模型-视图-控制器)框架,它提供了灵活的事件驱动模型和强大的Action支持,用于构建企业级Web应用。本话题聚焦于如何利用WebWork来处理Excel文件的上传,并将其数据导入到...
在学习过程中,除了阅读手册,还建议动手实践,结合实际项目加深理解,以便更好地应用WebWork框架解决实际问题。此外,了解WebWork的进化历程和它如何与Struts2等其他框架融合也很有帮助,因为这能让你了解框架的...
基于三层架构的Web层需要解决十个关键问题,WebWork提供了相应的解决方案: 1. 数据输入:WebWork通过请求参数绑定技术获取HTTP数据,并自动将字符数据转换为模型对象。 2. 输入验证:利用内置的验证机制,可以对...
8. **异常处理(Exception Handling)**:Webwork2提供了优雅的异常处理机制,允许开发者自定义错误页面和处理策略,确保应用程序在出现异常时仍能提供用户友好的反馈。 9. **国际化(Internationalization)**:...