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' 标头
浏览器在 ajax 请求上发送 Origin 标头,但不是通过简单的 HTTP Get 请求。为啥?
Java Play Framework 2.6 不返回“Access-Control-Allow-Origin”CORS 标头