使用HttpURLConnection对Android应用程序上的网站发送请求时,Cookie似乎被禁用(即使它们不是!)

时间:2015-07-10 16:18:31

标签: android cookies android-asynctask httpurlconnection

我的问题:

我有一个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();

我尝试过多种解决问题的方法:

  • 与USER_AGENT混淆,保持它为Mozilla / 5.0或现在就像现在这样,这就是当我在手机上访问网站时whatsmyuseragent.com给我的东西。该网站还告诉我,我已启用Cookie!
  • 使用CookiePolicy作为ACCEPT_ALL。
  • 确保同时接受所有Cookie&#39;和#39;接受第三方Cookie&#39;在我的手机浏览器上检查(Chrome和默认的Android浏览器)。
  • 使用httpClient apache类来完成工作。这不起作用,甚至当我使用我在类似的stackoverflow线程中看到的httpContext变量时也是如此。我停止使用httpClient,因为这个帖子告诉我改为使用HttpURLConnection:Android HttpClient persistent cookies
  • 使用CookieStore尝试通过它获取cookie。
  • 调查教师网站正在做什么,当它实际上给了我&#34;你需要启用cookie&#34;信息。它似乎试图创建一个cookie,如果失败,它会给你这个消息。
  • 阅读不同的stackoverflow线程并尝试他们的解决方案,没有结果。

这些都不起作用。如果有人知道如何解决这个问题,请帮助。

2 个答案:

答案 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();