我试图使用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
(火狐)<---> thewebsite.com
(Java的HttpURLConnection类),虽然我传递的字符串,以httpUrlConnection.setRequestProperty
与"WWW".
我还没有分析Wireshark的字节输出,但我知道服务器Location
在我的响应的头字段中没有返回相同的内容.
我的问题是:
(1)是否可以控制请求中的头字段的顺序,如果是,是否可以使用HttpURLConnection
?如果没有,是否可以使用Java直接控制HTTP头中的字节?[我不拥有服务器,所以我唯一的希望让POST方法正常工作是通过我的应用程序假装是Firefox,服务器并不是真的很冗长,我唯一的信息是:Apache with PHP]
(2)有没有办法修复上面描述的setRequestProperty()问题("www")?
(3)还有什么可以重要的?(我需要关注底层,TCP ......?)
谢谢你的评论.
PS.我试图模拟一个没有发送cookie的情况,这样我就可以忽略这个效果了.
首先,标题的顺序无关紧要.
其次,为了手动覆盖host
标题,您需要sun.net.http.allowRestrictedHeaders=true
在代码中设置
System.setProperty("sun.net.http.allowRestrictedHeaders", "true")
或者在JVM启动时
-Dsun.net.http.allowRestrictedHeaders=true
这是Oracle不久前提出的一项安全预防措施.那是因为根据RFC
Host request-header字段指定所请求资源的Internet主机和端口号,这是从用户或引用资源(通常是HTTP URL)给出的原始URI获得的.