Java HttpURLConnection | POST方法| HTTP头字段序列

Java HttpURLConnection | POST方法| HTTP头字段序列,java,http,post,httpurlconnection,Java,Http,Post,Httpurlconnection,我试图使用Java.net.HttpURLConnection在Java中“欺骗”Firefox HTTP POST请求。 我使用Wireshark检查发送的HTTP头,因此我(希望)有可靠的信息来源,为什么Java结果与理想情况不匹配(使用Firefox) 我已经将所有头字段完全设置为Firefox通过HTTP发送的值,并注意到头字段的顺序不同。 Firefox的输出如下所示: POST ... **Host** User-Agent Accept Accept-Language Accept

我试图使用Java.net.HttpURLConnection在Java中“欺骗”Firefox HTTP POST请求。 我使用Wireshark检查发送的HTTP头,因此我(希望)有可靠的信息来源,为什么Java结果与理想情况不匹配(使用Firefox)

我已经将所有头字段完全设置为Firefox通过HTTP发送的值,并注意到头字段的顺序不同。 Firefox的输出如下所示:

POST ...
**Host**
User-Agent
Accept
Accept-Language
Accept-Encoding
Referer
Connection
Content-Type
Content-Length
当我让wireshark利用Java实现时,它给了我一个稍微不同的字段序列:

POST...
**User-Agent**
Accept
Accept-Language
Accept-Encoding
Referer
Content-Type
Host
Connection
Content-Length
基本上,我有所有的字段,只是顺序不同。 我还注意到主机字段的发送值不同:
www.thewebsite.com
(Firefox)
thewebsite.com
(Java HttpURLConnection),尽管我将字符串传递给带有“www”的
HttpURLConnection.setRequestProperty

我还没有分析Wireshark的字节输出,但我知道服务器在我的响应的头字段中没有返回相同的
位置

我的问题是:

(1) 是否可以控制请求中标题字段的顺序,如果可以,是否可以使用
HttpURLConnection
?如果没有,是否可以使用Java直接控制HTTP头中的字节?[我没有自己的服务器,所以我唯一希望让POST方法工作的是通过我的应用程序假装成Firefox,服务器不是很详细,我唯一的信息是:Apache with PHP]

(2) 是否有一种方法可以解决上述setRequestProperty()问题(“www”)

(3) 还有什么重要的?(我是否需要关注底层,TCP…?)

谢谢你的评论


另外,我试图在不发送cookies的情况下模拟一种情况,这样我就可以忽略这种影响。

首先,标题的顺序是不相关的

其次,为了手动覆盖主机头,您需要在代码中设置
sun.net.http.allowerPrictedHeaders=true

System.setProperty("sun.net.http.allowRestrictedHeaders", "true")
或者在JVM启动时

-Dsun.net.http.allowRestrictedHeaders=true
这是Oracle不久前引入的安全预防措施。那是因为根据

主机请求标头字段指定Internet主机和端口 从原始文件中获取的被请求资源的编号 用户或引用资源提供的URI(通常是HTTP URL)


首先,标题的顺序是不相关的

其次,为了手动覆盖主机头,您需要在代码中设置
sun.net.http.allowerPrictedHeaders=true

System.setProperty("sun.net.http.allowRestrictedHeaders", "true")
或者在JVM启动时

-Dsun.net.http.allowRestrictedHeaders=true
这是Oracle不久前引入的安全预防措施。那是因为根据

主机请求标头字段指定Internet主机和端口 从原始文件中获取的被请求资源的编号 用户或引用资源提供的URI(通常是HTTP URL)


标题顺序并不重要。服务器获取的头文件也有问题。并且您无法控制httpUrlConnection标头顺序。但是,如果您编写自己的TCP客户端,则可以控制头顺序。比如:

clientSocket=新套接字(服务器主机、服务器端口)

第二个问题由Marcel Stör在第一个答案中回答。
a

标题顺序并不重要。服务器获取的头文件也有问题。并且您无法控制httpUrlConnection标头顺序。但是,如果您编写自己的TCP客户端,则可以控制头顺序。比如:

clientSocket=新套接字(服务器主机、服务器端口)

第二个问题由Marcel Stör在第一个答案中回答。
a

我很幸运使用了Apache Http组件,我猜是“主机”标题缺少“www.”造成了差异,可以使用Apache的
HttpPost
完全按照预期进行设置:

httpPost.setHeader("Host", "www.thewebsite.com");
Wireshark的输出证实了我的怀疑。这一次,HTTP post之前的TCP通信看起来也不同(客户机-->服务器,服务器-->客户机,客户机-->服务器),而不是(客户机-->服务器,服务器-->客户机,客户机-->服务器,客户机-->服务器)

现在我得到了所需的
位置
头值,服务器也在设置cookies.:)

这个问题在很大程度上得到了解决


实际上,我想使用lightweight
HttpUrlConnection
,因为这正是博客所建议的。
System.setProperty(“sun.net.http.allowerPrictedHeaders”,“true”)
也可以工作,如果它允许在
Host
值中使用“www.”。

我很幸运使用了Apache http组件,我猜是“Host”头缺少“www.”造成了差异,可以使用Apache的
HttpPost
完全按照预期进行设置:

httpPost.setHeader("Host", "www.thewebsite.com");
Wireshark的输出证实了我的怀疑。这一次,HTTP post之前的TCP通信看起来也不同(客户机-->服务器,服务器-->客户机,客户机-->服务器),而不是(客户机-->服务器,服务器-->客户机,客户机-->服务器,客户机-->服务器)

现在我得到了所需的
位置
头值,服务器也在设置cookies.:)

这个问题在很大程度上得到了解决


实际上,我想使用lightweight
HttpUrlConnection
,因为这正是博客所建议的。
System.setProperty(“sun.net.http.allowerPrictedHeaders”,“true”)
也可以工作,如果它允许在
Host
值中“www.”。

头的顺序不重要。谢谢。那么还有什么会把事情搞砸呢?TCP?标题的顺序不重要。谢谢。那么还有什么会把事情搞砸呢?TCP?谢谢大家对此发表评论。如果头字段的顺序无关紧要,那么在这种情况下,解决方案不是HTTP级别的。我尝试了一下Apache的Http组件,否则我真的需要升级