Javascript Spring 4/ExtJs 6文件上载-当文件大小超过限制时,ExtJs连接被拒绝错误

Javascript Spring 4/ExtJs 6文件上载-当文件大小超过限制时,ExtJs连接被拒绝错误,javascript,spring,extjs,spring-security,extjs6,Javascript,Spring,Extjs,Spring Security,Extjs6,我有一个正常工作的文件上传表单,除非我发送的文件大于我在Spring中配置的大小 我以前在Spring编写的另一个应用程序上使用过相同的代码,不同之处在于我使用的是ExtJs 4.2,现在使用的是ExtJs 6.0。旧的应用程序使用了SpringSecurity3,新的应用程序使用了SpringSecurity4 Spring端已配置为阻止超过3MB的文件 从WebMvcConfig.java: @Bean(name="multipartResolver") public CommonsMult

我有一个正常工作的文件上传表单,除非我发送的文件大于我在Spring中配置的大小

我以前在Spring编写的另一个应用程序上使用过相同的代码,不同之处在于我使用的是ExtJs 4.2,现在使用的是ExtJs 6.0。旧的应用程序使用了SpringSecurity3,新的应用程序使用了SpringSecurity4

Spring端已配置为阻止超过3MB的文件

从WebMvcConfig.java:

@Bean(name="multipartResolver")
public CommonsMultipartResolver commonsMultipartResolver() 
{
    ToolkitCommonsMultipartResolver resolver = new ToolkitCommonsMultipartResolver();
    resolver.setMaxUploadSize(Constants.UPLOAD_MAX_FILE_SIZE);
    return resolver;
}
从ToolkitCommonsMultipartResolver:

public class ToolkitCommonsMultipartResolver extends CommonsMultipartResolver {

@SuppressWarnings({ "rawtypes", "unchecked" })
@Override
protected MultipartParsingResult parseRequest(final HttpServletRequest request) {

    String encoding = determineEncoding(request);
    FileUpload fileUpload = prepareFileUpload(encoding);

    List fileItems;

    try {
        fileItems = ((ServletFileUpload) fileUpload).parseRequest(request);
    } 
    catch (FileUploadBase.SizeLimitExceededException ex) {
        System.out.println("******* MultipartParsingResult limit exceeded");
        request.setAttribute("fileSizeExceeded", ex);
        fileItems = Collections.EMPTY_LIST;            
    } 
    catch (FileUploadException ex) {
        throw new MultipartException("Could not parse multipart servlet request", ex);
    }

    return parseFileItems(fileItems, encoding);
}
}

我的自定义控制器:

@PreAuthorize("hasAuthority('ACTIVITY_CREATE_UPDATE')")
@RequestMapping(value = "/activity/editActivity", method = RequestMethod.POST, consumes="multipart/form-data", produces=MediaType.TEXT_HTML_VALUE )
public @ResponseBody String editActivity(@Valid ActivityBean bean, BindingResult result, HttpServletRequest request) {

    //WebMvcConfig.commonsMultipartResolver will throw exception if file size exceeds the max size
    //Passed as a request attribute
    Object exception = request.getAttribute("fileSizeExceeded");
    if (exception != null && FileUploadBase.SizeLimitExceededException.class.equals(exception.getClass())) 
    {
        log.info("File too large");
        String msg = "The file you sent has exceeded the maximum upload size of " + (Constants.UPLOAD_MAX_FILE_SIZE / 1000000L) + " MB.";
        return "{\"success\" : false, \"msg\" : \"" + msg + "\"}";
    }

    ...other code to process request
}
}

SpringSecurityHTTP标记具有以下代码,允许从服务器显示帧内容(X-frame-Options)。在我添加此代码之前,所有响应都被阻止(保存是否成功):

在onComplete()中,上传后会有一个调用

doc = me.getDoc();
此方法尝试访问阻止iFrame中从服务器返回的内容。在这种情况下,Spring安全标头似乎不起作用。有一个catch(e)抛出错误:

未捕获DOMEException:阻止原点为“”的帧访问跨原点帧。(…)


有人知道如何解决这个问题吗?我可以禁用Muitipart解析器并接受完整的文件,并在自定义代码中进行大小验证。如果文件超过大小,则首先阻止文件上载更有意义。这是Spring security 4还是ExtJs6的问题?

“除非我发送的文件比我在Spring中配置的文件大”。那么,您希望Spring做什么呢?多部分解析程序会切断请求,并应向客户端返回一条消息,告诉他们文件太大。然后在catch块中,您可以处理catch块,而不是引发异常。必须引发异常,这是确定控制器稍后运行时出现问题的唯一方法。我将它捕获为FileUploadBase.SizeLimitExceedeException,并在那里处理它。这与问题无关。“除非我发送的文件比我在Spring中配置的文件大”。那么,您希望Spring做什么呢?多部分解析程序会切断请求,并应向客户端返回一条消息,告诉他们文件太大。然后在catch块中,您可以处理catch块,而不是引发异常。必须引发异常,这是确定控制器稍后运行时出现问题的唯一方法。我将它捕获为FileUploadBase.SizeLimitExceedeException,并在那里处理它。这与问题无关。
/**
 * Callback handler for the upload function. After we've submitted the form via the
 * iframe this creates a bogus response object to simulate an XHR and populates its
 * responseText from the now-loaded iframe's document body (or a textarea inside the
 * body). We then clean up by removing the iframe.
 * @private
 */
onComplete: function()
doc = me.getDoc();