Java JSOUP如何在标头中发送Origin

Posted

技术标签:

【中文标题】Java JSOUP如何在标头中发送Origin【英文标题】:Java JSOUP how to send the Origin in the header 【发布时间】:2018-08-24 17:24:30 【问题描述】:

我正在尝试使用 JSOUP 测试我的服务,但我正在使用 CORS,我需要发送 来源仅用于测试 porpouses,但是当我发送这个时,我在服务器端没有收到,总是收到 null。

Connection con = Jsoup.connect("http://localhost:8080/myservice");
 con.userAgent("Mozilla");
 /* the origin is replaced to null automatically*/
 con.header("Origin", origin);
 con.ignoreHttpErrors(true);
 con.followRedirects(true);
 con.ignoreContentType(true);
 con.post();

我会做一些与此不同的事情吗?

已解决:

使用 ApacheHTTP 代替 JSOUP,导致 JSOUP 默认删除 Origin 标头。 :)

【问题讨论】:

origin 是一个实际变量吗? 是的,对不起。字符串来源 = "localhost:8080"; 试试 addHeader 吗? jsoup.org/apidocs/org/jsoup/… 没有addHeader这个方法,只有header(String, String)放header,其他headers可以,只有Origin不行。 可能是原始标头具有协议,请尝试使用localhost:8080 代替? 【参考方案1】:

在幕后,JSoup 使用java.net.HttpURLConnection 进行连接。 HttpURLConnection 有一组受限标题,包括“Origin”。这些似乎没有很好的记录,但可以在source 中清楚地看到。

正如您提到的,使用 HttpClient 将解决问题。

或者,要继续从 JSoup 直接连接,这取决于您的环境中发生的其他情况,设置sun.net.http.allowRestrictedHeaders 系统属性可能是一个选项。这可以在上面链接的源代码中进一步看到。

这将绕过HttpURLConnection 中的标头检查,但令人讨厌的是它被编码为共享静态值。这意味着需要在 JVM 中的任何位置建立第一个连接之前设置系统属性 - 例如。作为-D 命令行选项。

关于这个话题的更多信息over here。

有点离题,HttpURLConnection 源代码中的注释,将那里的受限标头与XMLHttpRequest2 进行比较很有趣 - 就好像它期望在浏览器中运行一样。这个限制可能要追溯到 Java 小程序时代?它现在对服务器端应用程序可能没有那么有用了。

【讨论】:

以上是关于Java JSOUP如何在标头中发送Origin的主要内容,如果未能解决你的问题,请参考以下文章

在 React to Java Backend 中发送带有参数的 get 请求,但在请求的资源上显示 No 'Access-Control-Allow-Origin' 标头

如何设置 Origin 请求标头

浏览器在 ajax 请求上发送 Origin 标头,但不是通过简单的 HTTP Get 请求。为啥?

Java Play Framework 2.6 不返回“Access-Control-Allow-Origin”CORS 标头

ASP.NET Core 在授权失败时发送 Access-Control-Allow-Origin 标头

缓存跨域资产时,Chrome 应用程序缓存不发送“Origin”标头