繁体   English   中英

jQuery:上传多张图片时,发布请求中断

[英]Jquery : Post Request is breaking while uploading multiple images

我正在使用Plupload js插件在一个请求中上传多个图像。 该插件的工作方式类似于某人一次添加5张图片,然后发布请求将发送5次以分别上传每张图片。 众所周知,发布请求需要唯一的csrf令牌,但在我的情况下,由于一次使用了相同的令牌,发布请求失败了。

这是我的代码...

<c:set var="csrfTokenVal"><csrf:token-value uri="<%=request.getRequestURI()%>"/></c:set>

<script>
var csrftokenV="${csrfTokenVal}";

$("#uploader").plupload({

    // General settings
    runtimes : 'html5,flash,silverlight,html4',
    url:'/view/SurgeryNotesComponentController?uploadSurgeryImage=true&'+csrftokenN+'='+csrftokenV,

    // User can upload no more then 20 files in one go (sets multiple_queues to false)
    max_file_count: 10,

    chunk_size: '1mb',

    // Resize images on clientside if we can
    resize : {
        width : 600, 
        height : 610, 
        quality : 90,
        //crop: true // crop to exact dimensions
    },

    filters : {
        // Maximum file size
        max_file_size : '1mb',
        // Specify what files to browse for
        mime_types: [
            {title : "Image files", extensions : "jpg,gif,png"},
            {title : "Zip files", extensions : "zip"}
        ]
    },

    // Rename files by clicking on their titles
    rename: true,

    // Sort files
    sortable: true,

    // Enable ability to drag'n'drop files onto the widget (currently only HTML5 supports that)
    dragdrop: true,

    // Views to activate
    views: {
        list: true,
        thumbs: false, // Show thumbs
        active: 'thumbs'
    },
    init: {
        FilesAdded: function(up, files) {
            $("#uploader_filelist").show();

        },


        FileUploaded: function(up, file, info, res) {
            var imageObjectArray=$.parseJSON(info.response);
            for(i=0;i<imageObjectArray.objectList.length; i++){
                $('#showfilelist ul').append("<li><a class='delIcon-image' href='#delete' id='delSurgeryImageIcon'></a><a id=" + imageObjectArray.objectList[i].uid + " class='cboxElement imguid' href='${contextPath}/view/SurgeryNotesComponentController?surgeryImage=true&"+csrftokenN+ "="+ csrftokenV+"&attachmentLocation="+imageObjectArray.objectList[i].attachmentLocation+"' target='_blank'><img src='${contextPath}/view/SurgeryNotesComponentController?surgeryImage=true&"+csrftokenN+ "="+ csrftokenV+"&attachmentLocation="+imageObjectArray.objectList[i].attachmentLocation+"'  border='0'>"+"</a> <strong>"+noteAddedMsg+"</strong><span class='image-created'>"+imageObjectArray.objectList[i].formattedDate+" "+byMsg+" "+imageObjectArray.objectList[i].userName+" </span></li>");
            }

            $("#uploader_filelist").empty().hide();
            _SPINE.colorboxOverlay.coloboxPopup();
            _SPINE.surgeryNotes.deleteImages();

            $(".plupload_done .plupload_file_thumb").removeClass("hide")
        },
        ChunkUploaded: function (up, file, response) {
            response = $.parseJSON(response.response || "null");
            if (response.chunk == 3) {
                up.stop();
                up.start();
            }
            console.log(file.loaded);

        }

    },
    // Flash settings
    flash_swf_url : '${siteAssetsUrl}/assets/spine/js/external/Moxie.swf',

    // Silverlight settings../assets/js
    silverlight_xap_url : '${siteAssetsUrl}/assets/spine/js/external/Moxie.xap'
});
</script>

在这里,您可以看到我正在生成scrf令牌(csrftokenV)并将其发送到url中以使其受支持。

现在的问题是,如果我上传的图像超过1张(假设是3张),那么3次发布请求将消失。 每次我获得相同的csrf令牌并在第一张图像上浮后,进一步的图像将不起作用,并且我将收到此异常...。

WARNING: potential cross-site request forgery (CSRF) attack thwarted (user:<anonymous>, ip:127.0.0.1, uri:/**/image, error:request token does not match session token)

请帮我解决这个问题。 谢谢

终于,我的一位朋友解决了这个问题。 无法通过客户端脚本处理此问题,因此我们利用Java的功能。 我们已经根据新请求更新了csrfToken并将其发送给响应。

这是一个解决方案..

        private String updateToken(HttpServletRequest request)
        {
            final HttpSession session = request.getSession(false);
            CsrfGuard csrfGuard = CsrfGuard.getInstance();
            csrfGuard.updateTokens(request);
            String newToken=(String) session.getAttribute(REQUEST_TOKEN);
            return newToken;
        }

设置newToken作为响应...

             response.setResult(this.updateToken(request));
             return response;

现在,我们可以在beforeUpload事件中更改网址,并在网址中设置新令牌。

 BeforeUpload: function(up, file) 
            {

                up.settings.url='/view/SurgeryNotesComponentController?uploadSurgeryImage=true&'+csrftokenN+'='+tokenRefresh

            }

 FileUploaded: function(up, file, info, res) 
            {
               var imageObjectArray=$.parseJSON(info.response);
                tokenRefresh=imageObjectArray.result;
           }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM