jsp中防止刷新后退等操作造成表单重复提交(纯jsp或者struts)

 1        js验证方法(js 判断防止form重新提交)

 1.1 在页面中设置一个隐藏域值判断

             <input   type="hidden"   value="false"  name="server"/>  
              如果已经POST   OK   过,   就改变   value="true"   ;   
              再次POST   时候,可以用   JS   在客户端判断   hidden   ,   也可以在SERVER   检查.   

 1.2 在页面中设置一个变量判断

<script language="javascript">

   var checkSubmitFlg = false;

   function checkSubmit() {

   if (checkSubmitFlg == true) {

   return false;

   }

   checkSubmitFlg = true;

   return true;

   }

   document.ondblclick = function docondblclick() {

   window.event.returnValue = false;

   }

   document.onclick = function doconclick() {

   if (checkSubmitFlg) {

   window.event.returnValue = false;

   }

   }

  </script>

<html:form action="myAction.do" method="post" οnsubmit="return checkSubmit();">

 1.3 将提交按钮或者image置为disable  

如 <html:form action="myAction.do" method="post"

   οnsubmit="getElById('submitInput').disabled = true; return true;">   

   <html:image styleId="submitInput" src="images/ok_b.gif" border="0" /> 

   </html:form>  

 

<input type="button" value="提交" οnclick="this.disabled=true;this.form.submit()">

2  清空缓存防止提交

<META         HTTP-EQUIV="pragma "         CONTENT= "no-cache ">             

<META         HTTP-EQUIV= "Cache-Control "         CONTENT="no-cache,         must-revalidate ">             

<META         HTTP-EQUIV= "expires "         CONTENT= "Wed,         26         Feb         1997         08:21:57         GMT ">    

 

3 session令牌方式

生成一个令牌保存在用户session中,在form中加一个hidden域,显示该令牌的值,form提交后重新生成一个新的令牌,将用户提交的令牌和session中的令牌比较,如相同则是重复提交

说简单点,防止重复提交的原理就是在服务端和在客户端同时存在一个Token,当客户端发送一个request到服务端的时候,包含这个token的信息,当然,这个请求同样会包含当前的sessionID,
当请求到达服务端的时候,服务端用过sessionID去得到当前的session,并且在该session中查找改Token,并且与request中所包含的Token进行比较,如果相同责为有效请求,在请求有效之前从session将该Token删除,这样,如果重复提交,则为无效请求.

用一段代码来表示吧.
首先定义两个变量

public static String TOKEN_FOR_SESSION="token.for.session";
public static String TOKEN_FOR_REQUEST="token.for.request";

 

考虑add这个方法需要防止重复提交,因此在add发出的这个request的时候,一定需要包含这个TOKEN,
因此,需要增加一个toAdd这样一个方法,在这个方法中,转向add这个页面,而toAdd这个方法中的概要代码:
String token=getToken();
request.setAttribute(TOKEN_FOR_REQUIRED,token);
session.setAttribute(TOKEN_FOR_SESSION,token);
request.getRequestDispatcher("/add.jsp").forward(request,response);

在add.jsp中包含如下信息:
<input type="hidden" value="${token.for.request}"/>

在add的action处理中:

String savedToken=request.getSession().getAttribute(TOKEN_FOR_SESSION).toString();
String requestToken=request.getParameter(TOKEN_FOR_REQUEST);

request.getSession().removeAttribute(TOKEN_FOR_SESSION);
if(savedToken.equals(requestToken))
{
    //TODO:your own business logic.
}

这个就是防止重复提交的概要思想.


4  redirect=true 或者 request.redirect();

重定向可以解决页面刷新带来的数据的重复提交的问题,我们自然可以利用重定向的方式来解决这个问题。但是struts的action里面mapping.findword()

 修改struts-config.xml 文件,在action里面有一个redirect重新定向的属性,struts中默认的是false,添加这个属性,改成true,在forword中写上要跳转页面的绝对或者相对地址就行了

修改如下:

<action-mappings

  <action attribute="newsActionForm" name="newsActionForm"

   input="/addnews.jsp" path="

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值