android http与web View的cookie管理

   一 . Android 中 webView 使用Cookie的相关问题:

         WebView 是基于webkit 内核的UI控件 (就是说我们再用CookieManager的时候要用webkit包下的),

         WebView相当于一个浏览器客户端,在本地维护每次会话的Cookie,保存在data/data/package_name/app_WebView/Cookies.db数据库中

                          (也就是说WebView的Cookie是和http请求的Cookie保存的地方不一样的),当webView进行url请求时,就会在Cookie数据库中根据url

                          去寻找对应的Cookie,携带发送给服务器(如果没有就不携带)。

        WebView的得管理是由android.webkit.CookieManager 维护的。


       1.WebView获取Cookie:

          mWebView.setWebViewClient(new WebViewClient(){

              @Override

               public void onPageFinished(WebView view,String url){

                     //webView页面加载完成会将Cookie信息维护到Cookie数据库中

                      android.webkit.CookieManager manager=android.webkit.CookieManager.getInstance();

                      String cookieStr=manager.getCookie(url);

                      super.onPageFinshed(view,url);

              }

         });

   

        或者可以在程序的任意位置:

       android.webkit.CookieManager manager=android.webkit.CookieManager.getInstance();

       String cookieStr=manager.getCookie(url);

       如果数据库中没有这个url路径下的cookie就会返回null;


        举例: 百度www.baidu.com进行WebView请求返回的Cookie为:

 BAIDUID=9226902D387AE998971687E2D6843563:FG=1; bd_af=1; BDSVRTM=19;    H_WISE_SIDS=114550_109776_102433_108373_100100_116291_116399_116559_

107319_115863_116476_114797_116094_116309_115538_115446_116387_116603_115351_114276_116411_110085; BDORZ=AE84CDB3A529C0F8A2B9DCDD1D18B695


     2.WebView请求时设置Cookie

        如果有需求,需要在加载webView的时候需要修改或者添加加载url的Cookie,比如在在app登录后需要将登陆的身份信息在WebView访问服务器的

        时候携带,一般是seesionID(服务器seesion的穿创建是和Cookie密切关联的,比如在www.baidu.com服务器中生成的Cookie标识seessionID的字段为BAIDUID)

        这样,WebView和app中http请求就会是一个Cookie信息,即使在app中登陆了,在访问WebView的时候也会让服务器明白,哦,这个WebView是谁谁谁登陆的

        然后去找在服务器端之前app登陆创建的seesion。

     

       webView设置Cookie信息,设置要在setJavaScriptEnabled之后,loadUrl之前,也就是中间的位置,否则的话设置无效。

       android.webkit.CookieManager manager=android.webkit.CookieManager.getInstance();

       manager.setCookie("url","cookie") 

  

       注:

            假如:manager.setCookie(".abc.com","ASD="a")

                        manager.setCookie(".abc.com","ASD="b")

            name值相同会覆盖值,manager.getCookie中ASD=b;


          格式:cookieManager.setCookie(url, key + "=" + cookie.getValue() + ";domain=" + "xxxx.com"+";path=/");

二 .  Android 中http请求获取Cookie与自定义Header

     

      1.httpurlConnection:

       

          设置header:  connection.setRequestProperty(key,value);

          这个应该是不会自动存储COOKIE信息,可以设置存储在CookieManager  但该类不是单利模式 所以建议自定义存储

    CookieManager manager=new CookieManager();

String urlString = "http://www.baidu.com";

CookieHandler.setDefault(manager);

URL url = null;

try {

    url = new URL(urlString);

    URLConnection connection = url.openConnection();
 
 

    Object obj = connection.getContent();

    url = new URL(urlString);

    connection = url.openConnection();

    obj = connection.getContent();

    CookieStore cookieJar = manager.getCookieStore();

    List<HttpCookie> cookies = cookieJar.getCookies();

    for (HttpCookie cookie : cookies) {

        Log.i("URLHTTPINFO",cookie.getName()+":*:"+cookie.getValue());

    }

} catch (MalformedURLException e) {

    e.printStackTrace();

} catch (IOException e) {

    e.printStackTrace();

}
 
 
conn获取方式:
String cookieStr = conn.getHeaderField("Set-Cookie");

      2.httpClient  过时了 

           Httpclient会存储当次请求的cookie内容,存储位置在 httpClient.getCookieStore 但是apache建议自定义cookie存储方式,

           因为cookiestore把cookie放在arraylist里很容 易被系统回收。

     3.okhttp

         

  okHttpClient=new OkHttpClient();
            Request builder =new Request.Builder()
                    .url("http://www.baidu.com")
                    .addHeader("User-Agent","android")
                    .addHeader("Content-Type","text/html; charset=utf-8")
                    .build();
            okHttpClient.newCall(builder).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                }
                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    Headers headers = response.headers();
                    StringBuffer sb=new StringBuffer();
                    for (int i=0;i<headers.size();i++){
                        sb.append(headers.name(i)+":"+headers.value(i));
            Log.i("OKCOOKIESPINFO",headers.name(i)+":"+headers.value(i));
        }
    }
});

    

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值