我正在编写一个将在网站上自动填写表单的应用程序;(在Java中)
用户必须登录才能执行此操作,这就是问题出现的地方: 这是对登录请求的响应的一部分:
Set-Cookie:PHPSESSID = 3fvr31tb3c1iplpi3vqpvloar3;路径= /;域= .bursatransport.com
Set-Cookie:PHPSESSID = eanaj1d9egd73uiome0jtsed43;路径= /;域= .bursatransport.com
据我测试过,最后一个是正确的(我通过在浏览器中更改PHPSESSID cookie来测试它)
我的应用程序保留了第一个cookie。因此,在提交表单时,其行为就像用户不会登录一样。 Sometines它保留了最后一个cookie,但它没有成功提交表单(与之前相同)。
这是我的登录代码:
String query = String
.format("returnTo=/&Login[username]=%s&Login[password]=%s&Login[rememberMe]=0&yt4=",
URLEncoder.encode(name, charset),
URLEncoder.encode(password, charset));
CookieManager manager = new CookieManager();
manager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
CookieHandler.setDefault(manager);
URLConnection mycon = new URL(url).openConnection();
mycon.setDoOutput(true);
mycon.setRequestProperty("Accept-Language", "ro-RO,ro;q=0.8,en-US;q=0.6,en;q=0.4");
mycon.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
mycon.setRequestProperty("Accept-Charset", charset);
mycon.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded;charset=" + charset);
OutputStream output = null;
output = mycon.getOutputStream();
output.write(query.getBytes(charset));
mycon.getContent();
这肯定不是服务器问题,因为它正确响应浏览器请求(我正在用fiddler收听它们)
答案 0 :(得分:0)
我解决了这个问题(即使我还不知道它的根源)。
响应包含2个“Set-Cookie”标头,因为(这不是您最常见的原因)我的请求不包含PHPSESSID cookie; 所以我更改了代码,以便首先获取登录页面(没有登录数据)。 对此请求的响应设置为PHPSESSID cookie(但我没有登录)
然后我发送我的登录请求(现在包含一个PHPSESSID cookie),并且繁荣,它可以工作。
这是代码:
CookieManager manager = new CookieManager();
CookieHandler.setDefault(manager);
URLConnection mycon = new URL(url).openConnection();
mycon.getContent();
String query = String
.format("Login[username]=%s&Login[password]=%s&Login[rememberMe]=0&yt4=",
URLEncoder.encode(name, charset),
URLEncoder.encode(password, charset));
mycon = new URL(url).openConnection();
mycon.setDoOutput(true);
mycon.setRequestProperty("Accept-Language", "ro-RO,ro;q=0.8,en-US;q=0.6,en;q=0.4");
mycon.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
mycon.setRequestProperty("Accept-Charset", charset);
mycon.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded;charset=" + charset);
OutputStream output = null;
output = mycon.getOutputStream();
output.write(query.getBytes(charset));
output.close();
mycon.getContent();
mycon.getInputStream().close();
这篇“睁开眼睛”的帖子: Java: Handling cookies when logging in with POST