struts1.x的重复提交问题

本文介绍了一种利用Struts框架的令牌机制防止表单重复提交的方法。通过在表单中加入隐藏字段存储令牌,并在服务器端验证令牌的有效性,确保每次提交都是用户的新操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

请求有效性处理,使用令牌可以有效的防止重复提交。
protected String generateToken(HttpServletRequest request) 创建一个令牌.
protected boolean isTokenValid(HttpServletRequest request) 检查令牌是否有效
protected boolean isTokenValid(HttpServletRequest request,Boolean reset) 检查令牌是否有效,并且重置令牌(如果reset 是true)
protected void resetToken(HttpServletRequest request) 重置令牌
protected void saveToken(HttpServletRequest request) 添加令牌


基本原理:

服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,
看是否匹配。在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌除传给
客户端以外,也会将用户会话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并再次
提交的话,客户端传过来的令牌就和服务器端的令牌不一致,从而有效地防止了重复提交的发生。


 

 


 

在jsp加入隐藏字段

 <input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value='${sessionScope["org.apache.struts.action.TOKEN"] }' />

 

 

先在addElement方法里加入saveToken(request);然后会跳转到加了上面隐藏字段jsp页面,最后jsp提交到saveHvA103方法,能判断页面令牌值和服务端保存的值是否一致,如不一致显示“请不要重复提交”

 

=============================

下面是转载的其他的重复提交的例子(未经过测试,先保存备用)

 

struts   token一般需要进行2个action才能做到防止刷新.  
  做了几次.觉得很麻烦.我的项目里不想用struts.只是想把struts   token用在非struts项目里.  
  通过研究.找到一个新的方法.可以应用到所有的项目中.  
  首先struts   token原理是:  
  1.生成令牌  
  2.在表单隐含框里显示令牌值  
  3.提交表单,对隐含框令牌值与系统存的令牌值进行比较.如果正确说明没重复提交.错误说明有重复提交  
  4.清除令牌值  
  上面是原理.令牌值是以session值保存.所以只需要做2件事就可以实现struts   token功能  
  建2个页面。1个页面test1.jsp(用于提交表单用),另一个页面test2.jsp(接收表单值)  
  1.test1.jsp如下  
  <%  
  org.apache.struts.util.TokenProcessor.getInstance().saveToken(request);  
  %>  
  <form   action="test2.jsp"   method="post">  
  <input   type="hidden"   name="org.apache.struts.taglib.html.TOKEN"   value="<%=session.getAttribute("org.apache.struts.action.TOKEN")%>"   />  
      <label>username  
      <input   type="text"   name="username"   />  
      </label>  
      <p>  
          <label>password  
          <input   type="text"   name="password"   />  
          </label>  
      </p>  
      <p>  
          <label>  
          <input   type="submit"   name="Submit"   value="Submit"   />  
          </label>  
  </p>  
  </form>  
   
  2.test2.jsp如下  
  <%  
  Thread.sleep(3000);  
  String   username="";  
  String   password="";  
   
  if(org.apache.struts.util.TokenProcessor.getInstance().isTokenValid(request,true))  
  {  
  username=request.getParameter("username");  
   
  password=request.getParameter("password");  
  int   val=com.test.test.getVal();  
  System.out.println(val+"*********username:"+username);  
  System.out.println(val+"*********password:"+password);  
  org.apache.struts.util.TokenProcessor.getInstance().resetToken(request);  
  }  
  else  
  {  
  org.apache.struts.util.TokenProcessor.getInstance().saveToken(request);  
  System.out.println("error");  
  }  
   
  %>  
  username:<%=username%>  
  <br/>  
  password:<%=password%>  
  <br/>  
   
  说明:  
  saveToken方法就是生成一个令牌值,放在session里.session名为:org.apache.struts.action.TOKEN  
  isTokenValid(request,true):判断提交令牌值是否和session值一样.true表示调用该方法后重新生成一个令牌值,保证只接受一次提交  
   
  该方法适用于各个项目.  
  希望对大家解决重复提交有好处

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值