EasyJWeb中防重复提交使用及原理

  • 1、开启自动防提交功能 如果你的模块中需要防止重复提交的地方比较多,则可以使通过配置文件开启自动防提交功能。如下面的Module配置:

        
        

    开启了自动防重复提交功能后,只需要在要防重复提交的html表单中加上$html.token标签。而在Action中不用写任何与防提交有关的代码,系统自动就具会具有防重复提交的功能。

    2、手动控制防提交
    当然,如果不想使用自动防提交,则可以手动在Action中写代码控制重防提交。
    比如在一个文章来源的Action中,在添加方法中:

    public Page doAdd(WebForm form, Module module) ...{
    saveToken();
    return module.findPage("edit");
    }
    在保存对象的Action中,需要验证该令牌是否合法:
    public Page doSave(WebForm form, Module module) ...{
    If(!isVaildateToken())...{
    form.addResult("msg","请求已经处理,请不要重复提交");
    return new Page("add","/cms/newsSourceEdit.html");
    }
    NewsSource ns = new NewsSource();
    form.toPo(ns);
    Long ret = this.service.addNewsSource(ns);
    return this.doList(form, module);
    }

    并在添加对象的页面的html表单Form中添加一句:
    $html.token
    就完成了整个防止重复提交的功能。

    注意: 不管使用哪一种方式,一定要记得在相关html表单中加上$html.token这个标识。如下:

    $html.token

    3、实现原理分析
      EasyJWeb中防止重复提交的处理过程类似于Struts的方法,采用的是令牌机制。其思路为在Action中使用 AbstractCmdAction中提供的saveToken()方法来产生一个由sessionId和当前时间组成的令牌值,并将该令牌值保存在 session中。在页面的表单中使用$html.token产生一个带有该token值的hidden域,在请求提交后,在处理请求的Action中使 用AbstractCmdAction提供的isVaildateToken()方法来验证令牌是否合法。在处理完该请求后,且在答复发送给客户端之前, 将会产生一个新的令牌或者清空令牌,该令牌除传给客户端以外,也会将用户会话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并再次提交的 话,客户端传过来的令牌就和服务器端的令牌不一致,从而有效地防止了重复提交的发生。
    重点是:
      第一、在请求中有session中同样的令牌值,请求中的令牌值通过表单中的隐藏字段来保存,保存的形式如: ,这个value是TokenProcessor类中的generateToken()获得的,是根据当前用户的session id和当前时间的long值来计算的,并且是通过调用$html.token来自动产生的,在struts中是依赖其 标签产生的,而在EasyJWeb中,你需要显式的在Form里面调用。
      第二:在客户端提交后,我们要根据判断在请求中包含的值是否和服务器的令牌一致,因为服务器每次提交都会生成新的Token,所以,如果是重复提交,客户端的Token值和服务器端的Token值就会不一致。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值