0

为了获取一些信息,我的应用程序模拟了 Web 浏览器的行为。目标网站的登录会话有 3 个步骤:

  1. 访问表单(提供 cookie 进行身份验证)
  2. 发送包含所有信息的 POST 请求
  3. 服务器答案在标头中包含一个链接,指示要访问的地址

为此,我有三个函数,一个获取页面并提取会话 Cookie。第二个提取第一页的形式并放置正确的信息。第三个准备 POST 请求,发送它,并读取标头中的位置。

它工作正常......但只有 API 10....... 有谁知道 API 10 之后发生了什么变化?

我已经尝试过使用 API 13 或更高版本的模拟器,在发送 POST 请求时,服务器会回答,就好像第一页中给出的 Cookie 无效一样。(我得到 200 的答案代码和登录页面......而不是 302 答案和要遵循的位置)。

我使用 java.net CookieManager & CookieHandler

例如,这里是第一个函数:

    private String GetPageContent(String url) throws Exception {

        URL obj = new URL(url);
        conn = (HttpURLConnection) obj.openConnection();

        // default is GET
        conn.setRequestMethod("GET");
        conn.setUseCaches(false);

        // act like a browser
        conn.setRequestProperty("User-Agent", USER_AGENT);
        conn.setRequestProperty("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
        conn.setRequestProperty("Accept-Language", "fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4");
        conn.setRequestProperty("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.3");

        if (MainActivity.cookies != null) {
            for (String cookie : MainActivity.cookies) {
                conn.setRequestProperty("Cookie", cookie);
            }
        }

        int responseCode = conn.getResponseCode();
        System.out.println("\nSending 'GET' request to URL : " + url);
        System.out.println("Response Code : " + responseCode);

        BufferedReader in = 
                new BufferedReader(new InputStreamReader(conn.getInputStream()));
        String inputLine;
        StringBuffer response = new StringBuffer();

        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }
        in.close();

        // Get the response cookies
        setCookies(conn.getHeaderFields().get("Set-Cookie"));

        return response.toString();

      }

这是第三个功能(第二个没什么特别的:

    private void sendPost(String url, String postParams) throws Exception {

        URL obj = new URL(url);
        conn = (HttpURLConnection) obj.openConnection();

        // Acts like a browser
        conn.setUseCaches(false);
        conn.setRequestMethod("POST");
        conn.setRequestProperty("User-Agent", USER_AGENT);
        conn.setRequestProperty("Accept",
            "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
        conn.setRequestProperty("Accept-Language", "fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4");

        for (String cookie : MainActivity.cookies) {
            System.out.println("Adding Cookie: "+cookie);
            conn.addRequestProperty("Cookie", cookie.split(";", 1)[0]);
        }


        conn.setRequestProperty("Connection", "keep-alive");
        conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        conn.setRequestProperty("Content-Length", Integer.toString(postParams.length()));

        // Update Progress bar -> 25
                    mProgression += 5;
                    msg = mHandler.obtainMessage(PROGRESSION, mProgression, 0);
                    mHandler.sendMessage(msg);

        conn.setDoOutput(true);
        conn.setDoInput(true);

        // Send post request
        DataOutputStream wr = new DataOutputStream(conn.getOutputStream());
        wr.writeBytes(postParams);
        wr.flush();
        wr.close();

        int responseCode = conn.getResponseCode();
        System.out.println("\nSending 'POST' request to URL : " + url);
        System.out.println("Post parameters : " + postParams);
        System.out.println("Response Code : " + responseCode);


        System.out.println("Attempt to get location");

        // Get the location of the ticket in the ResponseHeader
        setLocation(conn.getHeaderFields().get("Location"));    



        // Get the Cookie of the ResponseHeader AFTER sending credentials
        setLoginCookies(conn.getHeaderFields().get("Set-Cookie"));

        BufferedReader in = 
                 new BufferedReader(new InputStreamReader(conn.getInputStream()));
        String inputLine;
        StringBuffer response = new StringBuffer();

        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }
        in.close();
        // System.out.println(response.toString());

      }

日志猫没有问题,第三个函数不能越过"get("Location")",因为服务器没有返回任何位置...

感谢花时间回答那个问题的人......顺便说一句,这是我的第一个应用程序:)

再次感谢!

4

1 回答 1

0

我认为你应该使用一个更好的客户端,它可以自己处理所有的标题和正文,你可以使用 android 内置的HTTP 客户端,但它不能持久化 cookie,或者你可以使用效果很好的loopj 异步客户端。实际上,我发表了一篇文章,解释了我们是如何做到的,你可以在这里阅读。

于 2013-08-30T19:58:35.227 回答