我试图使用JSOUP测试我的服务,但我使用CORS,我需要发送 仅适用于测试用户的来源,但是当我发送此消息时,我不会在服务器端收到该消息,但始终会收到空。
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头。 :)
答案 0 :(得分:2)
在幕后,JSoup使用java.net.HttpURLConnection
建立连接。 HttpURLConnection
有一组受限标题,包括“Origin”。这些似乎没有得到很好的记录,但可以在source中清楚地看到。
正如你所提到的,使用HttpClient会解决问题。
或者,要继续使用JSoup的直接连接,根据您的环境中发生的其他情况,可以选择设置sun.net.http.allowRestrictedHeaders
系统属性。这可以从上面链接的来源中进一步看出。
这将绕过HttpURLConnection
中的标头检查,但令人烦恼的是它被编码为共享静态值。这意味着需要在JVM中的任何位置进行第一次连接之前设置系统属性 - 例如作为-D
命令行选项。
有关此主题的更多信息over here。
稍微讨论一下,HttpURLConnection
来源中的评论,将那里的受限标题与XMLHttpRequest2
进行比较很有意思 - 好像预计会在浏览器中运行一样。这个限制可以追溯到Java小程序的日子?对于服务器端应用程序来说,现在可能没那么有用了。