jsp防止刷新重复提交

1、 通过重定向的方式:把地址栏的地址显示为最后的地址。
2、 禁止客户端刷新:通过JS来控制,禁用刷新的功能、清除访问历史纪录。
3、 Struts自带的方式(令牌):
服务器端发放一次性使用的令牌方式,服务器端给客户端每次请求发一个令牌,在客户端提交之后,检查令牌,
如果这个令牌是第一次使用,就ok;否则,提示重复提交。  
Action中有个几个相关方法:  SaveToken(request):生成一个新的令牌,并保存到客户端的请求对象中。  
IsTokenValid(request,true):检查客户端的令牌是否是第一次使用,并且使该令牌失效。  
ResetToken(request):重置客户端的令牌。

参考struts的token(令牌)机制

在 提交的时候在Servlet中根据用户的sessionid和当前时间的long值生成一个令牌(每次提交都会生成一个新令牌),将令牌保存在 该用户的会话中,并将令牌的值以request属性形式传到前端页面,在前端页面的form中增加传递令牌的隐藏域<input type="hidden" name="clientToken" value="<%=clientToken%>" />,提交form的时候,也会将clientToken传入Servlet,如果session中保存的令牌值与传入的不同,则是重复提交,因为 每次请求Servlet都会生成新的令牌,刷新时的令牌值是旧的令牌值,不是最新的令牌值。

Java代码   收藏代码
  1. jsp:  

  2. //获取令牌、防止刷新重复提交  
  3. <form>中增加<input type="hidden" name="clientToken" value="${clientToken}>" />    
  4.   
  5. java:  
  6.   
  7. /** 
  8.      * 令牌验证防止刷新提交 
  9.      */  
  10.     private String clientToken;  
  11.   
  12.   
  13. /** 
  14.      * 验证防止刷新重复提交 
  15.      * @return 
  16.      */  
  17.     private boolean validateToken()  
  18.     {  
  19.         boolean bl = false;  
  20.         try  
  21.         {  
  22.             String sessionToken = (String) getHttpRequest().getSession().getAttribute(  
  23.                     "token");  
  24.             if (StringUtils.isNotEmpty(sessionToken) && !clientToken.equals(sessionToken))  
  25.             {  
  26.                 // 禁止刷新  
  27.                 bl = false;  
  28.             }  
  29.             else  
  30.             {  
  31.                 // 正常的操作  
  32.                 bl = true;  
  33.                   
  34.                 // 生成新令牌  
  35.                 String sToken = UUID.randomUUID().toString().toUpperCase();  
  36.                 getHttpRequest().getSession().setAttribute("clientToken", sToken);  
  37.                 // 替换旧令牌  
  38.                 getHttpRequest().getSession().setAttribute("token", sToken);  
  39.             }  
  40.         }  
  41.         catch (Exception e)  
  42.         {  
  43.             LOGGER.error(e.getMessage());  
  44.         }  
  45.           
  46.         return bl;  
  47.     } 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值