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

大体步骤分为:

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);
    }});

时间: 2024-11-06 09:26:50

form 表单提交,防止重复提交,加token的相关文章

form表单中控件较多,加载完成后切换页面都很慢的解决方法

form表单中控件较多,加载完成后点击都很慢,为什么?我一页面中form表单里面上百个控件(如input.select.radio.checkbox等),还有一些js脚本,加载速度还可以,都能全部显示完毕,但是点击一些事件(如切换tab.关闭模拟框,点击radio等)都非常慢,不知道为什么? 当我采用inprivate模式浏览时,以上动作都很快,但老用inprivate也麻烦,有何办法解决. 按理说form都在客户端显示完全了,其他操作都是客户端的操作阿应该不慢才对阿/. ------解决思路-

form表单用ge方式提交时ie显示中文参数乱码

有网友说 通过给form表单添加accept-charset="gb2312"和 onsubmit="document.charset='gb2312'" 但这样没能解决我的问题,我的源码是这样的: 这样做后,ie搜索还是不能成功, 后这样就可以了: <form method="get" target="_blank" id="searchform" name="searchform&quo

form表单的两种提交方式,submit和button的用法

一种是用submit提交.一种是用button提交.方法一: 在jsp的前端页面的头部插入一个js方法: function checkUser(){   var result = document.getElementById("userid").value;   var password = document.getElementById("userpassid").value;   if(result == ""  ){     alert(

沫沫金 - jQuery序列化form表单【支持ajax提交form对象表单entity.xxx】

需要form表单提交,大表单对字段后台人工处理太麻烦.还是选择form表单对象(entity.xx)提交方便,那么怎么ajax提交这样的form对象表单呢? 命名jquery.commons.js内容如下 /**  * FORM对象表单ajax提交前数据处理方法  * @param frm  * @returns JSON Object  */ function getFormJson(frm) {     var o = {};     var a = $(frm).serializeArra

form表单有条件的提交

form表单提交数据,比如,积分,score,在0--100之间 1 var score = $('#score').val(); 2 if(score !=''){ 3 if(isNaN(score)){ 4 layer.msg("积分请输入整数类型!"); 5 return false; 6 } 7 if(score<0 || score>100){ 8 layer.msg("积分值请输入0到100以内的数字!"); 9 return false;

jQuery实现ajax提交form表单(可以是提交json),用springmvc接收。图文详解

第一种方法(简单易用,防蚊虫): 1.1 从form表单到congtroller接收.1 是form表单,2 是ajax提交 3 springmvc接收 1.2 debug 看后台数据,看到了吧,userEO接收到数据了 1.3 有人想看看seralize和seralizeArray数据不同 seralize:id=1&name=xiaohua&age=18&sex=man seralizeArray[ id 1],[ name xiaohua],[ age 18],[ sex m

form表单取消按钮自动提交

默认写在form表单里的按钮可以自动提交表单,现在要实现的效果是点击button按钮调用js函数,再有ajax提交 <button type="button" class="btn btn-sub" onclick="return formSubmit();">提交</button> function formSubmit() { // 如果是修改渠道号,原来就有渠道参数,需要将原有的渠道参数初始化进去 $("#

form表单,submit切换提交

有时候会遇到用form表单提交数据的情况,还有再同一表单下提交两种信息,就比如说,四个input,都在一个表单里,submit有两个,一个是登陆,一个是注册,这时候我们就需要去验证,我点的是什么要往注册还是登陆里提交.表单代码如下. <form action="login.do" name="form1" > <div class="login-hidd"></div> <div class="

【转载】form表单的两种提交方式,submit和button的用法

1.当输入用户名和密码为空的时候,需要判断.这时候就用到了校验用户名和密码,这个需要在jsp的前端页面写:有两种方法,一种是用submit提交.一种是用button提交.方法一: 在jsp的前端页面的头部插入一个js方法: function checkUser(){   var result = document.getElementById("userid").value;   var password = document.getElementById("userpass

js表单验证时重复提交的问题

1.错误示例 上图中的提交表单的按钮类型是submit的,这样提交表单的时候就算你onclick事件中返回的是false表单还是会提交的 2.正确示例: 我们将按钮的类型改为button这样就不会发生重复提交表单的现象了.