我的问题:
我有一个Android应用程序。我正在使用HttpURLConnection将POST请求发送到外部网站上的登录表单。该网站使用cookie进行登录,我想通过捕获' Set-Cookie'来检查我的登录是否成功。来自我的POST请求的响应头的变量。我用扩展android的AsyncTask类的类来做这个。
问题是我从我的请求中得到的HTML响应清楚地表明我禁用了cookie,当然,我没有得到任何Set-Cookie标头。
期望的结果:
打印的回复标题字段应包含' Set-Cookie'头。 HTML应该包含一个表格:
错误:'登录失败。登录名和密码都区分大小写,请检查是否未启用大写锁定。"
或:
信息:'欢迎!您现在已登录'
取决于提供的用户名和密码。
实际结果:
POST请求成功,获取标头也是如此。这是我的System.out.println:
的结果Printing Response Header...
Key : null ,Value : [HTTP/1.1 200 OK]
Key : Connection ,Value : [close]
Key : Content-Language ,Value : [en]
Key : Content-Length ,Value : [14233]
Key : Content-Type ,Value : [text/html;charset=utf-8]
Key : Date ,Value : [Fri, 10 Jul 2015 15:32:17 GMT]
Key : Expires ,Value : [Sat, 1 Jan 2000 00:00:00 GMT]
Key : Server ,Value : [Zope/(2.13.20, python 2.7.6, linux2) ZServer/1.1]
Key : X-Android-Received-Millis ,Value : [1436542369028]
Key : X-Android-Response-Source ,Value : [NETWORK 200]
Key : X-Android-Sent-Millis ,Value : [1436542368849]
Key : X-Ua-Compatible ,Value : [IE=edge,chrome=1]
我看不到Set-Cookie变量。这并不奇怪,因为在HTML响应中,我在我的错误'中发现了这一点。表:
" Cookie未启用。您必须启用Cookie才能登录。"
如果我在笔记本电脑的网络浏览器中手动禁用cookie并尝试登录,那么这是我获得的网站。这是我无法解决的问题。
代码:
AsyncTask类在这里:
import android.os.AsyncTask;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.CookieHandler;
import java.net.CookieManager;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;
public class TutorWebConnectionTask extends AsyncTask<String, String, Void> {
private final String USER_AGENT = "Mozilla/5.0 (Linux; Android 5.0.1; SAMSUNG GT-I9505 Build/LRX22C) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/2.1 Chrome/34.0.1847.76 Mobile Safari/537.36";
HttpURLConnection con;
@Override
protected Void doInBackground(String... strings) {
try {
String url = "http://tutor-web.net/login_form";
URL obj = new URL(url);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
CookieHandler.setDefault(new CookieManager());
//add reuqest header
con.setRequestMethod("POST");
con.setRequestProperty("User-Agent", USER_AGENT);
con.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
String urlParameters = "__ac_username=user&__ac_password=12345";
// Send post request
con.setDoOutput(true);
DataOutputStream wr = new DataOutputStream(con.getOutputStream());
wr.writeBytes(urlParameters);
wr.flush();
wr.close();
Map<String, List<String>> map = con.getHeaderFields();
System.out.println("Printing Response Header...\n");
for (Map.Entry<String, List<String>> entry : map.entrySet()) {
System.out.println("Key : " + entry.getKey()
+ " ,Value : " + entry.getValue());
}
int responseCode = con.getResponseCode();
System.out.println("\nSending 'POST' request to URL : " + url);
System.out.println("Post parameters : " + urlParameters);
System.out.println("Response Code : " + responseCode);
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
if(inputLine.contains("enable cookies")) {System.out.println("Cookies are disabled -> " + inputLine);}
response.append(inputLine);
}
in.close();
//print result
System.out.println(response.toString());
}catch(Exception e) {e.printStackTrace();}
return null;
}
}
按下我的Android应用程序上的按钮,在我的mainActivity中,我只是这样做:
TutorWebConnectionTask task = new TutorWebConnectionTask();
task.execute();
我尝试过多种解决问题的方法:
这些都不起作用。如果有人知道如何解决这个问题,请帮助。
答案 0 :(得分:0)
需要在POST之前在应用程序中设置cookie,否则在第二次向服务器发出请求之前不会看到它。
答案 1 :(得分:0)
在onCreate()
(或此实例仅初始化一次的任何地方)中使用CookieHandler,如下所示:
CookieHandler.setDefault(new CookieManager());
还有一点不要自己设置cookie。因此,无论您在何处设置httpurlconnection的属性,请尝试不要在那里设置设置cookie。它将由CookieHandler内部处理,例如
if(key.equalsIgnoreCase("Cookie")
{
// do nothing.
}
else
{
conn.addRequestProperty(key,value);
}
// set some other properties except cookies.
conn.connect();