`
chengyue2007
  • 浏览: 1470700 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

struts2.0防止重复提交

阅读更多

双击制御
有些时候一些操作会非常的耗费时间(Long Lived Operation),例如这个数据库的导出,表表生成等。有些时候程序的使用者看到很长时间服务器没有反应,倾向于多次点击提交按钮。这样恰恰相反,由于重新使服务器运行相同的长时间操作,反而让反应时间更慢。

我们如何来制御这样的操作呢?
我们能不能在每个页面生成的时候,自动生成一个特殊的隐藏字段,这个隐藏字段具有唯一性。每次向服务器提交请求的时候,服务器就记录下这个隐藏字段,当在看到有相同的特殊字段的内容提交时,服务器认为这是重复提交,将画面定位到一个特殊的画面来提示客户重复提交了数据。

在Struts2中,内容了对双击的制御操作,特殊的隐藏字段叫做token。

如何在生成页面的时候生成token字段?
使用token标签。
代码如下:
<s:url id="formUrl" action="longLivedTokenAction"/>
<s:form action="%{formUrl}" method="post">
      <s:token />
      <s:textfield name="name" label="Name"/>
      <s:textfield name="password" label="Password"/>
      <s:submit/>
     
</s:form>
其中<s:token />标签用来生成一个唯一的隐藏字段,在运行的时候生成的内容如下:
<input type="hidden" name="struts.token" value="C21ZWHEH0Q4B6FY15ZO5BFM1I9W8SIQH" />

如何在服务器上记录已经提交的token?
可以使用token intercepter。
代码如下:
<action name="longLivedTokenAction" class="com.jpleasure.LongLivedTokenAction">
            <interceptor-ref name="token"/>
            <interceptor-ref name="basicStack"/> 

<!--这里的默认的拦截器必须填写,不然其他的参数不能获取-->
            <result>/jsp/longLived.jsp</result>
            <result name="invalid.token">/jsp/invalidToken.jsp</result>
</action>
上述<interceptor-ref name="token"/>表示所有的请求必须经过token Interceptor,token Interceptor作用就是纪录所有已经提交的token。那么发现提交的token被重复提交的时候怎么办呢?也许大家已经猜到了,他会重定向到invalid.token所指向的页面,也就是/jsp/invalidToken.jsp。

基于Interceptor的执行顺序按照struts.xml中定义的顺序,为了更早的结束重复提交的处理,应该将Token Interceptor放在所有Interceptor的最面。

有了上述的Token Interceptor,可以防止客户重复提交,大大地降低了服务器的负荷。但是对用户来说,可能会很不方便,一不小心点击了提交按钮,进入到了invalid.token页面,就再也回不去了,上述的操作就再也看不见了。

等待画面
我们能不能提供一个等待画面呢?
每次我们提交之后画面立即迁移到一个类似状态条的画面,这个画面不断的向服务器请求,以确定Action是否执行完毕,一旦Action执行完毕,立即定位到正确的画面。这样不是更好。

Struts2也提供了对等待画面的支持。
首先当我们提交完成的时候,画面会前一到一个叫做等待画面的页面。等待画面定时的向服务器提交请求,以确定服务器操作是否完成。另外正在执行的Action需要有一个拦截对象,拦截等待页面的每一次请求,告诉等待页面是否处理完成。

首先我们需要定义,等待页面和Action是否完成的拦截对象
<action name="longLivedAction" class="com.jpleasure.LongLivedAction">
            <interceptor-ref name="completeStack"/>
            <interceptor-ref name="execAndWait"/>
            <result name="wait">/jsp/wait.jsp</result>
            <result name="success">/jsp/after.jsp</result>
</action>
<result name="wait">/jsp/wait.jsp</result>定义了等待画面是/jsp/wait.jsp,当我们向服务器提交请求之后,画面会迁移到这个画面。
<interceptor-ref name="execAndWait"/>定义了一个拦截对象,告诉等待画面是否完成了长时间操作。
那么等待画面如何定期的查询呢?
之需要一个指向该Action调用的一个不断地刷新即可。代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="s" uri="/struts-tags" %>

<html>
<head>
    <title>Please wait</title>
    <meta http-equiv="refresh" content="5;url=<s:url includeParams='all'/> "/>
</head>
<body>
</body>
</html>

Please wait while we process your request.
<a href="<s:url includeParams="all" />"> Click Here</a> if this page does not reload automatically.

上述黑体部分表示,一旦画面建立,就建立了一个刷新,每5秒钟刷新一次,刷新的廉洁为
url=<s:url includeParams=”all”/>,meta是标准浏览器支持的内容之一。
在运行的时候可以看到生成需下的内容:
<meta http-equiv="refresh"
content="5;url=/wait/jsp/longLivedAction.action?name=zhangsf&amp;value=119 "/>
如果浏览器不支持自动刷新也不要紧,可以让客户自己点击Click Here来确定操作是否完成。

其实这里最重要的是execAndWait Interceptor,每次向它拦截的Action发送请求的时候,execAndWait会确定Action操作是否完成,如果完成,将画面定位到对应的页面(通常是SUCCESS指向的页面),否则纸箱wait指向的页面。

分享到:
评论

相关推荐

    struts2.0struts2.0struts2.0struts2.0struts2.0struts2.0

    struts2.0struts2.0struts2.0struts2.0struts2.0struts2.0struts2.0struts2.0struts2.0struts2.0

    struts2.0中文教程

    01 为Struts 2.0做好准备 02 常用的Struts 2.0的标志(Tag) 03 Struts 2.0的Action讲解 04 在Struts 2.0中国际化(i18n)您的应用程序 05 转换器(Converter)——Struts 2.0中的魔术师 06 在Struts 2.0中实现表单...

    Struts2.0视频教程+struts2.0中文教程

    Struts2.0视频教程,struts2.0中文教程,Struts2.0视频教程,struts2.0中文教程,

    sstruts2.0 struts2.0

    sstruts2.0 struts2.0sstruts2.0 struts2.0sstruts2.0 struts2.0sstruts2.0 struts2.0sstruts2.0 struts2.0sstruts2.0 struts2.0sstruts2.0 struts2.0sstruts2.0 struts2.0sstruts2.0 struts2.0

    struts2.0的数据校验框架struts2.0的数据校验框架

    struts2.0的数据校验框架struts2.0的数据校验框架struts2.0的数据校验框架struts2.0的数据校验框架

    Struts 2.0系列(MAX)

    Struts 2.0系列(MAX),pdf格式,全方位介绍struts2: 常用的Struts 2.0的标志(Tag)介绍 Struts 2.0的Action讲解 在Struts 2.0中国际化(i18n)您的应用程序 转换器(Converter)——Struts 2.0中的魔术师 在Struts ...

    JavaEE源代码 Struts2.0

    JavaEE源代码 Struts2.0JavaEE源代码 Struts2.0JavaEE源代码 Struts2.0JavaEE源代码 Struts2.0JavaEE源代码 Struts2.0JavaEE源代码 Struts2.0JavaEE源代码 Struts2.0JavaEE源代码 Struts2.0JavaEE源代码 Struts2.0...

    struts2.0jar包

    struts2.0jar包 struts2.0包 struts2.0源文件

    Struts2.0 Jar包

    此为Struts2.0最新Jar包,方便各位用于Struts2.0的开发.

    struts 2.0 详细配置

    struts 2.0 详细配置 struts 2.0 详细配置 struts 2.0 详细配置

    Struts 2.0

    清晰的介绍了Struts 2.0框架的工作流程,Action线程安全,程序入口,配置文件。

    Struts2防止重复提交解决方案

    防止重复提交的总要解决方案 相信对struts的学者有帮助 大家看看

    Struts2.0学习Struts2.0文档

    为Struts 2.0做好准备 Struts作为MVC 2的Web框架,自推出以来不断受到开发者的追捧,得到用广泛的应用。作为最成功的Web框架,Struts自然拥有众多的优点: MVC 2模型的使用 功能齐全的标志库(Tag Library) 开放...

    struts2.0入门案例

    struts2.0 入门案例、简单的struts2.0入门案例 2.0配置包,基础

    struts2.0源代码

    struts2.0源代码(有关于struts2.0实现上传与下载和如何操作数据库的源代码),非常有用

    struts2.0的数据校验struts2.0的数据校验

    struts2.0的数据校验struts2.0的数据校验struts2.0的数据校验struts2.0的数据校验struts2.0的数据校验struts2.0的数据校验

    struts2.0的基本jar包

    struts2.0的基本jar包,用于开发struts2.0的项目

    struts2.0的特点

    struts2.0的特点

Global site tag (gtag.js) - Google Analytics