【发布时间】:2015-09-17 07:51:17
【问题描述】:
我正在使用浏览器和 jetty/apache httpclient 访问一个网站(我隐藏了原始网站名称,因为它违反了政策)。
该网站在网络浏览器上运行良好。
使用 api 我可以登录网站,获取会话 cookie JSESSIONID 和主页 html 内容。但在那之后,当我提交任何表单或从 html 调用链接时,我收到 HTTP 错误代码 412(前提条件失败)。
我了解此错误是由于客户端标头中的问题。我从浏览器设置了所有标题(使用 chrome 浏览器中的检查元素进行检查)。我仍然有同样的错误。
我无法找到导致问题的标题。
这是来自浏览器的标题 请求标头
- 接受:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8
- 接受编码:gzip、放气
- 接受语言:en-GB,en-US;q=0.8,en;q=0.6
- Cache-Control:max-age=0
- 连接:保持活动状态
- 内容长度:318
- 内容类型:application/x-www-form-urlencoded
- Cookie:语言=en_IN; __gads=ID=14c64d8f9fd7de54:T=1424658276:S=ALNI_Mba1kvJO4mLo7R-T2jUJE9zCYck5A; SLB_Cookie=ffffffff09461c2d45525d5f4f58455e445a4a422971; JSESSIONID=36m4Oo6dCML_Wvx-Wgmm9rtLh9mbURxnZhWIVwg-zHaNzFQeUt9C!-1989013783; _ga=GA1.3.379900459.1428120216
- 主办方:www.irctc.co.in
- 来源:https://www.example.com
- 推荐人:https://www.example.com/context/home
- 升级不安全请求:1
- User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36
我从码头客户端设置的相同标题。
Request request = httpClient.newRequest(url);
request.method(HttpMethod.POST);
request.agent(USER_AGENT);
request.accept("text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
request.header(HttpHeader.REFERER,"https://www.example.com/context/home");
request.header(HttpHeader.ACCEPT_ENCODING, "gzip, deflate");
request.header(HttpHeader.ACCEPT_LANGUAGE, "en-GB,en-US;q=0.8,en;q=0.6");
request.header(HttpHeader.CACHE_CONTROL, "max-age=0");
request.header(HttpHeader.CONNECTION, "keep-alive");
request.header(HttpHeader.CONTENT_TYPE, "application/x-www-form-urlencoded");
request.header(HttpHeader.HOST, "www.example.com);
for (Map.Entry<String, String> entry : params.entrySet()){
request.param(URLEncoder.encode(entry.getKey(), "UTF-8"), URLEncoder.encode(entry.getValue(), "UTF-8"));
if(!StringUtils.isEmpty(content)){
content+="&";
}
content+=URLEncoder.encode(entry.getKey(), "UTF-8")+"="+URLEncoder.encode(entry.getValue(), "UTF-8");
}
request.header(HttpHeader.CONTENT_LENGTH, ""+content.length());
我看到请求中存在 JSESSIONID 和 SLB_Cookie。由于该网站超出了我们的控制范围,我真的无法追踪问题所在。
请帮我解决这个问题。感谢任何解决客户端问题的指针。有什么方法可以确定导致此问题的标头。
【问题讨论】:
-
看起来对于发布请求内容长度没有明确要求。所以内容长度似乎没有问题
-
我看到这个问题可能与 JSF 视图状态参数有关。我提交的表单包含 javax.faces.ViewState 隐藏参数。如果从提交中删除此参数,我会返回相同的页面作为响应。使用此参数,我得到 412。问题仍然是相同的表单提交适用于浏览器,但不适用于 jetty/apache httpclient
标签: http jsf-2 http-headers viewstate jetty-9