form 表单提交,防止重复提交,加token

发布时间:2020-07-18 18:03:04 作者:v512345
来源:网络 阅读:1947

    

大体步骤分为:

    1.通过java 生成随机数放在http 的header 里面

        String token = IdentityUtil.uuid32();
        getRequest().getSession().setAttribute("server_token", token);

    2.把生成token 放到隐藏域中,

String html = "<input type=\"hidden\" id=\"puff_beetl_client_token\" name=\"puff_beetl_client_token\" autocomplete=\"off\" value=\"" + token + "\" />";
        try {
            ctx.byteWriter.writeString(html);
        } catch (IOException e) {
            e.printStackTrace();
        }

输出到页面;


3.写个拦截器,页面传过来的token与java生成token进行匹配;

    public void intercept(DispatcherExecutor executor) {
        String server_token = PuffContext.removeSessionAttr("server_token");
        String client_token = PuffContext.getRequest().getHeader("Puff-ClientToken");
        if (StringUtil.empty(server_token) || StringUtil.empty(client_token) || !server_token.equals(client_token)) {
            if (PuffContext.ajax()) {
                RetMsg msg = RetMsg.error(RetCode.ILLEGAL_SUBMIT, "非法表单提交申请!");
                PuffContext.getResponse().setHeader("illegal_submit", "yes");
                executor.setResult(ViewFactory.json(msg));
            } else {
                throw new IllegalArgumentException("非法表单提交申请!");
            }
        } else {
            executor.execute();
        }

        //如果匹配了。重新生成token到页面,防止重复提交

        String token = IdentityUtil.uuid32();
        PuffContext.setSessionAttribute("server_token", token);
        PuffContext.getResponse().setHeader("server_token", token);

    }


4.页面

    $.ajax({
    url:"${ctxPath}/xx",
    data:$('#form').serialize(), 

     type:"POST",
    datatype:"json",
    beforeSend: function(request) {

    //把token 放到http header 中      

    request.setRequestHeader("Puff-ClientToken",$("#puff_beetl_client_token").val());
    },
    success:function(data){
        if(data.code=="403"){
            layer.close(index);
            Popbox.sureWithBtn(data.msg);
        }else{
            var msg=eval("("+data.msg+")");
            var code=msg.code;
            if(code==success){
                layer.close(index);
                window.location.href="${ctxPath}/success;
            }else{
                flag=false;
                layer.close(index);
                Popbox.sureWithBtn(msg.message);
            }
            
        }
    
        
    },
    complete:function(request){
        if(!flag){  //提交成功,就不改变http头部header,就是当失败才重新把token放到http header中
           $("#puff_beetl_client_token").val(request.getResponseHeader("server_token"));
        }
     },
    error:function(){
        layer.close(index);
    }});

    

推荐阅读:
  1. jQuery Form Plugin
  2. form 表单提交前验证

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

form 防止 表单提交

上一篇:Windows证书部分

下一篇:11.2.0.3升级到11.2.0.4报错ORA-01157 ORA-01110

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》