繁体   English   中英

Android,如何通过HttpClient()从URL获取cookie?

[英]Android, how to get a cookie from URL via HttpClient()?

我有一个登录活动,我必须为我的网站创建一个发布请求才能将用户登录到我的移动应用程序中。 要在我的网站上创建发布请求,我需要使用csrf cookie作为参数,这意味着我必须首先从URL中获取cookie,然后再使用csrf值创建发布请求。

这是我的代码:

        HttpClient client = new DefaultHttpClient();

        HttpPost post = new HttpPost("http://192.168.178.163:8080/login/");

        try {

            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
            nameValuePairs.add(new BasicNameValuePair("username", "xxx"));
            nameValuePairs.add(new BasicNameValuePair("password", "yyy"));
            //csrfmiddlewaretoken
            String res = null;

            post.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            HttpResponse response = client.execute(post);
            res = response.toString();
            res = res.replaceAll("\\s+","");
            BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));

            String line = "";
            while ((line = rd.readLine()) != null) {
                Log.i("line", line);
                //System.out.println(line);
                if (line.startsWith("csrftoken=")) {
                    String key = line.substring(5);
                    Log.i("key", key);
                }

            }
        }
        catch (IOException e) {
            txt_Error.setText(e.toString());
        }

知道怎么做吗? 我已经读过有关CookieSyncManager的信息,但我根本不理解。任何想法或代码示例都将是您的不二之选。

HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost("http://192.168.178.163:8080/login/");
CookieStore cookieStore = new BasicCookieStore();
HttpContext context = new BasicHttpContext();
context.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
...
HttpResponse response = client.execute(post, context);
List<Cookie> cookies = cookieStore.getCookies();
CookieMonster.eat(cookies); // :)

首先是获取csrftoken(如您在问题中提到的)。 AFAIK,您还必须在发布请求中将csrftoken作为数据发布,后端将根据cookie和发布数据进行检查/匹配。

例如,对于django后端,您必须添加以下内容:

nameValuePairs.add(new BasicNameValuePair("csrfmiddlewaretoken", "OBTAINED_TOKEN"));

如果来自http://192.168.178.163:8080/login/的获取请求返回一个表单,则您可以检查源,它可能包含一个隐藏字段,其中包含您要发送的令牌的名称/值。

希望这可以帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM