论坛首页 入门技术论坛

防止表单重复提交

浏览 3779 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-10-03  
jsp 页面:
  <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>
    <s:if test="null == web">
            新增页面
        </s:if>
        <s:else>
            更新页面
        </s:else>
    </title>
    <s:head theme="xhtml"/>
  </head>
   <body>
    <center>
     	<h3>
       <s:if test="null == web">
            新增页面
        </s:if>
        <s:else>
            更新页面
        </s:else>
        </h3>
    <s:form method="post" action="add">
     	<s:hidden name="web.id"  label="ID号"  theme="xhtml"/><br>
     	<s:textfield name="web.web" label="别名"  theme="xhtml"/><br>
     	<s:textfield name="web.webname" label="对应的网页"  theme="xhtml"/><br>
     	<tr><td></td><td align="center"><input name="cancle" type="button" onclick="javascript:history.go(-1)" value="返回" />
     	 <input type="submit" name="submit" value="提交" /></td></tr>
      
 <s:token />

     	</s:form>
    </center>
  </body>
</html>


只要在JSP页面中表单中放<s:token />这样的标签就行了。

struts.xml配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
  <constant name="struts.i18n.encoding" value="utf-8" /> 
    <package name="test" extends="struts-default" >
 <interceptors>
  <interceptor-stack name="to">
   <interceptor-ref name="defaultStack"></interceptor-ref>
   <interceptor-ref name="token"></interceptor-ref>
  </interceptor-stack>
</interceptors>
<action name="add" class="action.TestAction" method="add">
            <result name="success">/success.jsp</result>
            <result name="error">error.jsp</result>
            <result name="invalid.token">/tokenerror.jsp</result>
            <interceptor-ref name="to"></interceptor-ref>
</action>
   </package>
</struts>

这样就可以实现防止表单重新提交
   发表时间:2008-10-06  
在服务器集群的场景下,这个方式就报废了。

还是要搭建Session服务器,才是正道。
0 请登录后投票
   发表时间:2008-10-06  

taopian 写道

在服务器集群的场景下,这个方式就报废了。 还是要搭建Session服务器,才是正道。


是吗?
还没有搞过集群的场景,Session服务器的?未搞过哦。可否介绍一下。
0 请登录后投票
   发表时间:2008-10-06  
这个东西跟Session有什么关系?
0 请登录后投票
   发表时间:2008-10-07  
taopian 写道
这个东西跟Session有什么关系?

<s:token/>的原理就是在session总保存一个字符串。
仔细观察包含<s:token/>的页面会发现这些东西
<input type="hidden" name="struts.token.name" value="struts.token"/>
<input type="hidden" name="struts.token" value="BXPNNDG6BB11ZXHPI4E106CZ5K7VNMHR"/>
当页面提交的时候时候他会判断这个值是不是和session的一样,如果是一样的哪么OK,没问题你可以提交,并且会修改session里的值。哪么如果你刷新,那你页面上的值和session的值就不一样的,struts就不允许你提交数据了。就是这个原理。

taopian 写道
在服务器集群的场景下,这个方式就报废了。
还是要搭建Session服务器,才是正道。

为什么集群环境就不可能呢?集群环境保证session同步不止session服务器一个方法吧?采用session复制技术也可以保证session里的值在各个服务器都是相同的,这样做不可以吗?
对session服务器了解甚少,有什么问题大家指正。
1 请登录后投票
   发表时间:2008-10-07  
token在现在多标签浏览的情况下已经不适用了
如果我先后开好几个一样的表单提交窗口,
再回到第一个表单,填写,提交,很无奈的会失败,而且一般用户对于失败的原因很费解
1 请登录后投票
   发表时间:2008-10-08  
taopian 写道
在服务器集群的场景下,这个方式就报废了。

还是要搭建Session服务器,才是正道。

F5.。
1 请登录后投票
   发表时间:2008-10-09  
集群的重要工作就是, 保证几台服务器的SESSION一致.

以上的程序我想应该不会有问题的.


--------------> 理论上的解释, 有用过的, 请发表意见!
1 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics