`
cjc
  • 浏览: 685288 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

在页面中使用WebWork的token标签解决表单重复提交问题

阅读更多

在页面中使用WebWorktoken标签解决表单重复提交问题

王保政

我们的项目是基于Struts开发的,在设计时没有考虑重复提交的问题,所以用户在点击页面的提交,然后在下一个浏览器页面点后退,或者点提交时没跳转到新页面,在当前页面多次点击提交按钮,这两种情况都会产生重复提交的问题,例如用户基本信息维护的新增页面,点两次保存会向数据库提交两次,这时数据库中会新增两条记录。

后来我们引入了Webwork框架(项目的主框架仍然是基于struts的,只是将webwork配置到当前项目中,就可以使用webworktoken标签),通过Webworktoken标签解决了这个问题(当然不是必须引入webwork才能解决,而是webwork提供了现成的token标签供我们使用),下面是引入了webworktoken标签的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.nameUserInfo.token的隐藏列,webwork除了生成了隐藏列外,还将token值写入到了session中的UserInfo.token变量。

在录入页面中生成了token之后,在struts的控制层如何控制表单不重复提交?见下面的控制层的代码:

try

{

String requestToken = request.getParameter("UserInfo.token");

String sessionToken = (String)session.getAttribute("UserInfo.token"); //JSP中直接使用//session,在Strutsaction类中用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 WW标签库是专门为WebWork框架设计的一组自定义标签,用于在JSP页面上进行动态数据展示、控制流操作和表单元素渲染。WW标签库提供了丰富的标签,例如`&lt;ww:if&gt;`、`&lt;ww:iterator&gt;`、`&lt;ww:set&gt;`、`&lt;ww:property&gt;...

    解决webwork客户端验证提示信息重复多次显示问题

    - **重构模板**:在模板中使用条件语句控制错误消息的显示,避免重复渲染。 - **修复Action错误处理**:确保在Action完成后清理错误信息,避免旧错误积累。 - **调整拦截器配置**:根据需要调整Interceptor配置,...

    webwork标签的使用和介绍

    WebWork 是一款基于 Java 的 MVC(Model-View-Controller)框架,它提供了强大的标签库来简化JSP页面的开发。这些标签使得开发者能够更高效地处理业务逻辑、数据展示和用户交互。以下是对WebWork标签的详细介绍: 1...

    WebWork UI标签

    WebWork UI标签是一种用于构建Web应用程序用户界面的组件,它提供了丰富的功能,使得开发者能够更加便捷地创建交互式的Web页面。WebWork是一个不绑定特定视图技术的框架,支持多种模板语言,如JSP、Velocity和...

    webwork标签

    WebWork是一个基于Java的MVC(Model-View-Controller)框架,它提供了强大的标签库来帮助开发者在JSP页面上更高效地构建动态Web应用程序。WebWork标签库分为多个类别,包括通用标签、组件化标签、流程控制标签、迭代...

    WebWork标签手册

    **范例**:为了访问存储在`session`中的`User`对象的多个字段,可以通过重复使用`#session[‘user’]`,但更高效的做法是使用`set`标签定义一个临时变量,从而减少代码冗余。 ##### push标签:值栈管理的高级工具 ...

    Webwork标签库CHM

    Webwork标签库CHM是一个关于WebWork框架中标签库的参考文档,主要涵盖了WebWork框架中用于构建动态网页的自定义标签的相关知识。WebWork是一个Java Web开发框架,它简化了MVC(模型-视图-控制器)模式的实现,提高了...

    WebWork标签使用说明

    chm格式的webwork标签帮助文档,英文的

    WebWork标签库

    此标签常用于在JSP页面中显示模型数据。 - **`&lt;ww:push/&gt;`**:将一个值推入当前作用域的栈中。常用于需要在一个局部范围内改变变量值的场景。 - **`&lt;ww:param/&gt;`**:设置参数值。通常用于传递参数给其他标签或...

    webwork

    7. **标签库**:WebWork 自带一套丰富的标签库,可以方便地在JSP页面中使用,减少硬编码,提高开发效率。 8. **持久化支持**:WebWork 可以与各种持久化框架如Hibernate、iBatis等集成,方便进行数据库操作。 9. *...

    webwork中使用datepicker标签来选择日期

    接下来,我们需要在WebWork视图层的JSP页面中使用`datepicker`标签。WebWork标签库提供了一个`ww:datepicker`标签,它允许我们方便地与jQuery UI的Datepicker集成。下面是一个简单的例子: ```jsp ...

    webwork中上传文件

    在本例中,我们关注的是使用WebWork框架在Java环境中实现文件上传。WebWork是一个轻量级的MVC(Model-View-Controller)框架,它提供了处理HTTP请求和响应的强大工具,包括文件上传。 首先,我们需要了解WebWork的...

    webwork2.17中文使用手册

    webwork2.17中文使用手册

    WEBWORK

    这允许在 JSP 页面中使用 WebWork 的标签,如 `&lt;s:form&gt;`、`&lt;s:textfield&gt;` 等。 3. **welcome-file-list**:定义了当用户访问目录而不是具体文件时,服务器应该显示的默认欢迎页面。在这个例子中,如果用户访问...

    使用webwork上传excel并导入数据库

    在IT行业中,WebWork是一个基于Java的MVC(模型-视图-控制器)框架,它提供了灵活的事件驱动模型和强大的Action支持,用于构建企业级Web应用。本话题聚焦于如何利用WebWork来处理Excel文件的上传,并将其数据导入到...

    webwork中文参考手册

    在学习过程中,除了阅读手册,还建议动手实践,结合实际项目加深理解,以便更好地应用WebWork框架解决实际问题。此外,了解WebWork的进化历程和它如何与Struts2等其他框架融合也很有帮助,因为这能让你了解框架的...

    WebWork深入浅出.doc

    基于三层架构的Web层需要解决十个关键问题,WebWork提供了相应的解决方案: 1. 数据输入:WebWork通过请求参数绑定技术获取HTTP数据,并自动将字符数据转换为模型对象。 2. 输入验证:利用内置的验证机制,可以对...

    Webwork2_guide

    8. **异常处理(Exception Handling)**:Webwork2提供了优雅的异常处理机制,允许开发者自定义错误页面和处理策略,确保应用程序在出现异常时仍能提供用户友好的反馈。 9. **国际化(Internationalization)**:...

Global site tag (gtag.js) - Google Analytics