Android之Cookie在开发中应用

本文介绍了Cookie的概念,它是用于辨别用户身份和进行会话跟踪的数据,存储在用户本地终端。在Android应用中,Cookie用于减轻服务端压力,如登录后保存用户信息。但同时,Cookie存在安全风险,可能被截取。文章通过代码演示了如何在Android中使用HttpClient处理Cookie,并提到了在Retrofit框架中的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Cookie介绍-来自百度百科

Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)。定义于 RFC2109 和 2965 中的都已废弃,最新取代的规范是 RFC6265[1] 。(可以叫做浏览器缓存)
Cookie可以保持登录信息到用户下次与服务器的会话,换句话说,下次访问同一网站时,用户会发现不必输入用户名和密码就已经登录了(当然,不排除用户手工删除Cookie)。而还有一些Cookie在用户退出会话的时候就被删除了,这样可以有效保护个人隐私。
Cookie在生成时就会被指定一个Expire值,这就是Cookie的生存周期,在这个周期内Cookie有效,超出周期Cookie就会被清除。有些页面将Cookie的生存周期设置为“0”或负值,这样在关闭浏览器时,就马上清除Cookie,不会记录用户信息,更加安全。

Cookie在Android的应用

  • 为了减轻服务端的压力,有时候在登录过后,服务端会为客户端生成一个cookie,当客户端想要获取登录后的信息,不必每次请求都携带用户名和密码,只需要带上cookie,当cookie超期时,会获取到相应的信心,提示用户重新进行登录
  • cookie会有不安全性,有可能被截取,然后模拟登录状态获取信息

代码演示

  • 模拟登录,获取cookie,抓的包模拟–
//登录按钮
    public void login(View v) {
        new Thread() {
            public void run() {
                try {
                    //创建HttpClient对象
                    DefaultHttpClient defaultHttpClient = new DefaultHttpClient();
                    //创建httpPost对象,指定请求地址
                    HttpPost httpPost = new HttpPost(
                            "http://www.meirixue.com/api.php?c=login&a=index");
                    //创建集合的键值对
                    List<BasicNameValuePair> parameters = new ArrayList<BasicNameValuePair>();
                    //添加用户名和密码----这里的用户名大家可以下载每日学客户端注册一个--抓包抓的测试接口,用户名和密码不能给大家
                    parameters.add(new BasicNameValuePair("userName",
                            "xxxxxxxxxx"));
                    parameters.add(new BasicNameValuePair("password",
                            "xxxxxxxxxx"));
                    parameters.add(new BasicNameValuePair("dosubmit", "1"));

                    // 添加参数
                    httpPost.setEntity(new UrlEncodedFormEntity(parameters));
                    //执行请求
                    HttpResponse httpResponse = defaultHttpClient
                            .execute(httpPost);
                    int code = httpResponse.getStatusLine().getStatusCode();
                    //判断一下响应码
                    if (code == 200) {
                        //获取网络流
                        InputStream inputStream = httpResponse.getEntity()
                                .getContent();
                        //将流转换成字符串
                        String parseStream = StreamUtils
                                .parseStream(inputStream);
                        System.out.println("---" + parseStream);
                        // 获取cookie---这种方式是HttpClient专属方式,每种方式是不同的
                        CookieStore cookieStore = defaultHttpClient
                                .getCookieStore();
                        List<Cookie> cookies = cookieStore.getCookies();
                        //进行拼接--这里拼接根据公司是不同的,这里的拼接效果是 key=value;key=value;
                        StringBuffer sb = new StringBuffer();
                        for (int i = 0; i < cookies.size(); i++) {
                            Cookie cookie = cookies.get(i);
                            String cookieName = cookie.getName();
                            String cookieValue = cookie.getValue();
                            if (!TextUtils.isEmpty(cookieName)
                                    && !TextUtils.isEmpty(cookieValue)) {
                                sb.append(cookieName + "=");
                                sb.append(cookieValue + ";");
                            }
                        }

                        // 存到文件中
                        SharedPreferencesUtils.saveString(MainActivity.this,
                                "cookie", sb.toString());

                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            };
        }.start();
    }
  • 登录之后,获取到这个cookie并存储到本地,再获取一些个人信息时,携带者cookie去做请求
/**
     * 查询课程信息--需要在登录结束之后,获取到的cookie并保存到本地之后,获取cookie信息,作为请求头
     * 
     * @param v
     */
    public void queryInfo(View v) {

        new Thread() {
            public void run() {
                try {
                    //创建客户端对象
                    DefaultHttpClient defaultHttpClient = new DefaultHttpClient();
                    //这个地址是进行个人数据的请求,前提是先完成了登录
                    HttpPost httpPost = new HttpPost(
                            "http://www.meirixue.com/api.php?c=notice&a=index");

                    // 添加cookie
                    httpPost.addHeader("Cookie", SharedPreferencesUtils
                            .getString(MainActivity.this, "cookie", ""));

                    HttpResponse httpResponse = defaultHttpClient
                            .execute(httpPost);
                    int code = httpResponse.getStatusLine().getStatusCode();
                    //如果请求成功,并且成功码是200代表是已经成功了,如果是205,代表未登录的状态
                    if (code == 200) {
                        InputStream inputStream = httpResponse.getEntity()
                                .getContent();
                        String parseStream = StreamUtils
                                .parseStream(inputStream);
                        System.out.println("---" + parseStream);

                    } else {
                        System.out.println("---" + code);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            };
        }.start();

    }

以上就是对Cookie的代码演示…是基于Android的HttpClient来做的模拟,如果想要从其他网络框架中使用,需要用其他方式
这篇文章就对Retrofit中使用cookie做了讲解
http://blog.youkuaiyun.com/zhiyuan0932/article/details/54318944

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值