欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

解决Android webview设置cookie和cookie丢失的问题

程序员文章站 2022-06-05 08:35:20
android页面嵌套了一个h5,h5页面内部有用户登陆页面,发现h5页面的登陆功能无法使用,一直登陆失败。和web那边商量一会,发现js写入的cookie丢失了。所有需要android这边在重写写入...

android页面嵌套了一个h5,h5页面内部有用户登陆页面,发现h5页面的登陆功能无法使用,一直登陆失败。和web那边商量一会,发现js写入的cookie丢失了。所有需要android这边在重写写入一次。

    mwebview = view.findviewbyid(r.id.mall_view);
    settings = mwebview.getsettings();
    settings.setjavascriptenabled(true);
    settings.setloadsimagesautomatically(true);
    settings.setdomstorageenabled(true);
    //不缓存
    settings.setcachemode(websettings.load_no_cache);
    mwebview.setwebviewclient(new mywebviewclient());

  class mywebviewclient extends webviewclient{
    @override
    public boolean shouldoverrideurlloading(webview view, string url) {
      if (url != "") {
        //重点写入cookie
        hashmap<string, string> map = new hashmap<>();
        map.put("referer", view.geturl());
        view.loadurl(url, map);
      }
      return true;
    }

    @override
    public void onpagefinished(webview view, string url) {
      //获取登陆后的cookie,看是否写入
      cookiemanager cookiemanager = cookiemanager.getinstance();
      string cookiestr = cookiemanager.getcookie(url);
      super.onpagefinished(view, url);
    }
  }

以上就解决了登陆失败的问题!

还有就是登陆状态的同步,需要保存和设置cookie

  /**
   * 获取接口中的cookie
   * @param loginurl
   */
  private void synccookie(final string loginurl) {

    new thread(new runnable() {


      @override
      public void run() {
        try {
          stringbuilder builder = new stringbuilder();
          url url= null;
          byte[] data = builder.tostring().getbytes("utf-8");
          url = new url(loginurl);
          httpurlconnection connection =
              (httpurlconnection) url.openconnection();

          connection.setdooutput(true);
          connection.setrequestproperty("content-type",
              "application/x-www-form-urlencoded");
          connection.setrequestproperty("content-length",
              integer.tostring(data.length));
          connection.setrequestmethod("get");
          connection.setinstancefollowredirects(false);
          outputstream os = connection.getoutputstream();
          os.write(data);
          os.close();
          int arstcode = connection.getresponsecode();
          if (arstcode == httpurlconnection.http_ok) {
            cookie = connection.getheaderfield("set-cookie");
          }

        } catch (malformedurlexception e) {
          e.printstacktrace();
        } catch (unsupportedencodingexception e) {
          e.printstacktrace();
        } catch (protocolexception e) {
          e.printstacktrace();
        } catch (ioexception e) {
          e.printstacktrace();
        }
      }
    }).start();
  }
    //设置cookie
    if(cookie != null && cookie.length() > 0){
      android.webkit.cookiemanager cookiemanager =
          android.webkit.cookiemanager.getinstance();
      cookiemanager.setacceptcookie(true);
      cookiemanager.setcookie(sysparam.shoppingmall, cookie);
      cookiesyncmanager.getinstance().sync();
    }

补充知识:android webview带cookie访问url

问题描述

在原生和h5混合开发的时候会遇到这么一个问题,用webview加载某个url时,你只是app登录了账号,但是网页却没有,所有会禁止访问此url,webview就会显示白屏。

所以要访问此url,需要带上cookie进行访问。这个cookie就是用app登录时所存储的cookie

实现方法和一些环境

网络请求方式

httpsurlconnection

这里既然用到了httpsurlconnection 说明我所加载的url是https协议

所以webview加载的时候会白屏

报错信息:

1

这是由于证书和域名不匹配,我的调试环境在内网服务器上,而证书是绑定在公网的域名上的。

所以需要webview跳过证书验证,

跳过证书验证

 webview.setwebviewclient(new webviewclient() {
      @override
      public void onreceivedsslerror(webview view, sslerrorhandler handler, sslerror error) {
        log.e("app_name",error.tostring());
        handler.proceed();
      }
    });

然后设置cookie

cookie是在app使用httpsurlconnect发起登录请求时保存在本地的cookie

app登录成功后保存cookie到本地

sharedpreferences sharedpreferences = getsharedpreferences("login",mode_private);
sharedpreferences.editor editor = sharedpreferences.edit();
string cookieval = conn.getheaderfield("set-cookie");
editor.putstring("all_cookie",cookieval);

是一个结构如下的值:

session=f19b09e9-69b2-4ab4-9daf-ea224523a092; path=/; secure; httponly

写入cookie

/**
*@param cookie 上面获取到的存储在本地的cookie字符串
*@param url 要加载的页面url
*/
 private void setcookie(string cookie,string url) {
    string stringcookie = cookie;
    cookiemanager cookiemanager = cookiemanager.getinstance();
    if (build.version.sdk_int >= build.version_codes.lollipop) {
      cookiemanager.removesessioncookies(null);
      cookiemanager.flush();
    } else {
      cookiemanager.removesessioncookie();
      cookiesyncmanager.getinstance().sync();
    }
    cookiemanager.setacceptcookie(true);
    cookiemanager.setcookie(url, stringcookie);
  }

所有关键代码

 sharedpreferences sharedpreferences = getsharedpreferences("login",mode_private);
 string cookie = sharedpreferences.getstring("session","");
 string all_cookie = sharedpreferences.getstring("all_cookie","");
 log.e("weibiao",all_cookie);
 webview = findviewbyid(r.id.other_account_service_webview);
 webview.setwebviewclient(new webviewclient() {
   @override
   public void onreceivedsslerror(webview view, sslerrorhandler handler, sslerror error) {
     log.e("weibiao",error.tostring());
     handler.proceed();
   }
 });
 initwebviewsettings();//webview的一些设置
 setcookie(all_cookie,url);//在loadurl之前调用此方法
 webview.loadurl(url);

以上这篇解决android webview设置cookie和cookie丢失的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。