Java SubmitCompleteTEvent的GWT的getResults()在使用FileUpload提交表单后返回null

Java SubmitCompleteTEvent的GWT的getResults()在使用FileUpload提交表单后返回null,java,file-upload,gwt,Java,File Upload,Gwt,在一个应用程序中使用GWT成功实现文件上载后,我尝试将其传输到另一个应用程序,但在提供的SubmitCompleteHandler中无法检索从上载servlet返回的字符串。SubmitCompleteEvent.getResults只返回null 返回null的一个典型原因似乎是上载servlet位于不同的域中。但由于GWT和上载servlet在同一上下文中运行,因此不应该是跨域问题 FileUpload小部件包含在FormPanel中。单击按钮时,将提交表单。这将调用一个servlet,实际

在一个应用程序中使用GWT成功实现文件上载后,我尝试将其传输到另一个应用程序,但在提供的SubmitCompleteHandler中无法检索从上载servlet返回的字符串。SubmitCompleteEvent.getResults只返回null

返回null的一个典型原因似乎是上载servlet位于不同的域中。但由于GWT和上载servlet在同一上下文中运行,因此不应该是跨域问题

FileUpload小部件包含在FormPanel中。单击按钮时,将提交表单。这将调用一个servlet,实际上,调试过程中会到达一个断点。在现实世界中,它会将文件存储在服务器端并返回文件名。在这个简化的示例中,它只向响应编写器写入一个字符串

带有文件上载片段的FormPanel:

FileUploadServlet代码段:

是否存在已知与GWT的SubmitCompleteHandler冲突的库或库版本

任何想法都很感激

更新:在将属于spring security的所有工件从4.0.4.RELEASE降级到3.2.4.RELEASE之后,它就可以工作了。将其升级到4.1.2.RELEASE也无法正常工作。

此问题与spring security 4.X附加到响应[1]的X-Frame-Options:DENY标头有关。由于GWT应用程序通常加载在iframe中,因此此标头无法正确处理来自在iframe中执行的客户端代码的表单提交

要修复问题,应禁用框架选项策略或将其切换到SameOrgin。 例如,对于xml配置到:


[1]

要更改x帧选项,您可以在响应标题中添加x帧选项作为SAMEORIGIN。
与response.setHeaderX帧选项类似,SAMEORIGIN

一,。我不认为这是GWT的问题。只需尝试在带有表单的简单平面页面上使用此servlet。还要查看浏览器的开发控制台中的原始响应。2.可能您有一些过滤器,它包装了HttpServletResponse和Writer。尝试通过从servlet中的断点跳出调用堆栈帧进行调试,以查看将响应发送给调用方之前的最后一点。1。servlet在不同的应用程序中工作,响应返回到浏览器。在其他应用程序中不是这样。。。将属于spring security的所有工件从4.0.4.RELEASE降级到3.2.4.RELEASE之后,它就可以工作了。如果将它们升级到4.1.2.0版本,也无法正常工作。2.在调试过程中,我看到所有过滤器仍然带有servlet给出的响应。但它不再出现在浏览器的原始响应中。可能是X-Frame-Options标题问题。默认情况下,SpringSecurity4.x会为响应追加此标题。尝试禁用此标头以进行检查。@AlexanderLeshkin在我的applicationContext.xml中添加到使其正常工作。非常感谢你。您想添加我接受的答案,还是希望我这样做?我添加了答案。这不是因为客户端代码在iframe中执行,而是因为表单提交到iframe,所以结果页面显示在iframe中,标题禁止
final FormPanel form = new FormPanel();
form.setAction("upload"); // results "upload" directly below context
form.setEncoding(FormPanel.ENCODING_MULTIPART);
form.setMethod(FormPanel.METHOD_POST);
VerticalPanel panel = new VerticalPanel();
form.setWidget(panel);
FileUpload upload = new FileUpload();
upload.setName("uploadFormElement");
panel.add(upload);

panel.add(new Button("Submit", new ClickHandler() {
    public void onClick(ClickEvent event) {
        form.submit();
    }
}));
form.addSubmitCompleteHandler(new FormPanel.SubmitCompleteHandler() {
    public void onSubmitComplete(SubmitCompleteEvent event) {
        Window.alert("===> " + event.getResults() + " <==="); // shows "===> null <==="
    }
});
<servlet> 
    <servlet-name>FileUploadServlet</servlet-name>
    <servlet-class>mypackage.FileUploadServlet</servlet-class> 
</servlet> 
<servlet-mapping>
    <servlet-name>FileUploadServlet</servlet-name>
    <url-pattern>/upload</url-pattern> 
</servlet-mapping>
public class FileUploadServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html");
        response.getWriter().write("OK");
        response.getWriter().flush();
    }

}
<s:headers>
  <s:frame-options policy="SAMEORIGIN" />
</s:headers>
 HttpSecurity cfg = ...;
 cfg.headers().frameOptions().sameOrigin();