使用 FileUpload 提交表单后,GWT 的 SubmitCompleteEvent returns null 的 getResults()

GWT's getResults() of SubmitCompleteEvent returns null after submitting form with FileUpload

在一个应用程序中使用 GWT 成功实现文件上传后,我尝试将其传输到另一个应用程序,但是无法在提供的 [=15] 中检索来自上传 servlet 的字符串 return =]. SubmitCompleteEvent.getResults() 只是 return 为空。

returning null 的一个典型原因似乎是上传 servlet 在不同的域中。但是由于GWT和上传servlet运行在同一个context下应该不是跨域问题。

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

FormPanelFileUpload 片段:

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

web.xml 片段:

<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>

FileUploadServlet 片段:

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

}

是否有已知的库或库版本与 GWT 的 SubmitCompleteHandler 冲突?

欢迎任何想法...

更新:将所有属于 spring-security 的工件从 4.0.4.RELEASE 降级到 3.2.4.RELEASE 后,它就可以工作了。将它们升级到 4.1。2.RELEASE 它也不起作用。

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

要解决问题,应禁用框架选项策略或将其切换为 SAMEORIGIN。 例如。 xml 配置为 <s:http>:

<s:headers>
  <s:frame-options policy="SAMEORIGIN" />
</s:headers>

或者 Java 配置使用 org.springframework.security.config.annotation.web.configurers.HeadersConfigurer.frameOptions():

 HttpSecurity cfg = ...;
 cfg.headers().frameOptions().sameOrigin();

[1] https://docs.spring.io/spring-security/site/docs/current/reference/html/headers.html#headers-frame-options

要更改 x 帧选项,您可以添加 X-Frame-Options 作为 SAMEORIGIN 作为响应 header。 喜欢response.setHeader("X-Frame-Options","SAMEORIGIN");