使用 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。
FormPanel
和 FileUpload
片段:
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();
要更改 x 帧选项,您可以添加 X-Frame-Options
作为 SAMEORIGIN
作为响应 header。
喜欢response.setHeader("X-Frame-Options","SAMEORIGIN");
在一个应用程序中使用 GWT
成功实现文件上传后,我尝试将其传输到另一个应用程序,但是无法在提供的 [=15] 中检索来自上传 servlet 的字符串 return =]. SubmitCompleteEvent.getResults()
只是 return 为空。
returning null 的一个典型原因似乎是上传 servlet 在不同的域中。但是由于GWT和上传servlet运行在同一个context下应该不是跨域问题。
FileUpload
小部件包含在 FormPanel
中。单击按钮时,将提交表单。这将调用一个 servlet(实际上,在调试过程中到达了一个断点)。在现实世界中,它会将文件存储在服务器端并 return 文件名。在这个简化的示例中,它只是将一个字符串写入响应 Writer。
FormPanel
和 FileUpload
片段:
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();
要更改 x 帧选项,您可以添加 X-Frame-Options
作为 SAMEORIGIN
作为响应 header。
喜欢response.setHeader("X-Frame-Options","SAMEORIGIN");