通过HTTPS发出POST请求导致错误403(禁止)

时间:2017-12-15 13:11:07

标签: jquery https jboss download http-post

我正在使用jQuery fileDownload(由John Culviner创建)来加载由JBoss服务器使用RESTEasy动态生成的DOCX文件。应用程序和文件位于同一个域中。

这适用于HTTP GET提取的文档。

但是,在一种情况下,我必须使用HTTP POST请求,因此我可以将额外的有效负载附加到请求中。这也适用于我使用HTTP的本地开发环境。但是,在生产环境中,服务器受HTTPS 保护。那里的文件下载不起作用。在浏览器控制台中,我收到了文档网址的错误403(禁止访问)

这里有什么问题,我该如何解决?看起来浏览器无法访问资源,但我不确定这是客户端还是服务器问题。我是否必须在任何一方设置其他HTTP标头?或者这是JBoss配置问题吗?

由于我无法在本地重现问题,因此很难调试。

客户代码:

var downloadUrl = '/MyApp/foobar/download';

var downloadConfiguration = {
    httpMethod: "POST",
    data: JSON.stringify($scope.payload),
    successCallback: onSuccess,
    failCallback: onError
};

$.fileDownload(downloadUrl, downloadConfiguration);

服务器代码:

@POST
@Path("/download")
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces("text/word")
public Response generateDocument(final InputStream request) throws Exception {
  // ...

  Response.ResponseBuilder builder = null;
  File file = createMyDocument();

  builder = Response.ok((Object)file);
  builder.header("Content-Disposition", String.format("attachment; filename=\"%s.%s\"", FILENAME, EXTENSION));
  builder.header("Set-Cookie", "fileDownload=true; path=/");

  return builder.build();
}

修改

我还尝试过设置其他HTTP标头,但它没有帮助:

builder.header("X-Frame-Options", "SAMEORIGIN");
builder.header("Access-Control-Allow-Origin", "*");

编辑2:

我为下载网址添加了Security Constraintweb.xml,但没有帮助:

<security-constraint>
  <web-resource-collection>
    <web-resource-name>Foobar-Download</web-resource-name>
    <url-pattern>/foobar/download</url-pattern>
  </web-resource-collection>
  <auth-constraint>
    <role-name>SOMEROLE</role-name>
  </auth-constraint>
  <user-data-constraint>
    <transport-guarantee>NONE</transport-guarantee>
  </user-data-constraint>
</security-constraint>

编辑3: jQuery fileDownload插件使用隐藏表单的iframe进行下载。也许这会干扰HTTPS连接?某种CORS问题?

4 个答案:

答案 0 :(得分:1)

您是否检查过服务器上的防火墙配置?如果我说一些显而易见的东西,我很抱歉,但是,当您第一次向服务器提出申请并且它不是来自同一目录而且未设置为允许任何来源(允许*)时,您将收到错误。在第一次使用allow origin *之后,您可以从您的机器发出本地请求,然后服务器应该接受它。告诉我你是否得到了什么。

答案 1 :(得分:1)

我最好的猜测是服务器的servlet安全过滤器处于活动状态,不允许向其余端点发送请求。您是否尝试过提高JBOSS的调试级别并检查日志是否有罪魁祸首?

我几乎100%确定它与http / https无关(或者有人实现了非常奇怪的逻辑)。

答案 2 :(得分:0)

您的请求是Json编码的,您的服务器正在等待编码的表单。

尝试将您的请求数据对象更改为FormData()对象。

答案 3 :(得分:0)

我最好的猜测这与JBOSS SSL配置有关。我建议你从那里开始工作。