精华内容
下载资源
问答
  • 主要介绍了解决Android webview设置cookiecookie丢失的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • Android页面嵌套了一个h5,H5页面...和web那边商量一会,发现js写入的cookie丢失了。所有需要Android这边在重写写入一次。 mWebView = view.findViewById(R.id.mall_view); settings = mWebView.getSettings(); ...

    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();
            }
    
    展开全文
  • 问题: mWebView.setWebViewClient(new WebViewClient... public boolean shouldOverrideUrlLoading(WebView view, String url) {  view.loadUrl(url);  return true;  }  }); 问题就出在这了, view.
    问题:
    mWebView.setWebViewClient(new WebViewClient() {
       public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
       }
      });

    问题就出在这了,  view.loadUrl(url)会丢失Referer
    Referer是Http一个头信息
    H5页面用Referer来判断页面的来源,从而进行一些逻辑判断

    解决办法:
    手动设置referer信息,代码如下:
    mWebView.setWebViewClient(new WebViewClient() {
       public boolean shouldOverrideUrlLoading(WebView view, String url) {
        HashMap<String, String> map = new HashMap<String, String>(); 
        map.put("Referer", view.getUrl());
        view.loadUrl(url, map);
        return true;
       }
      });

    展开全文
  • uniapp的webview 嵌入商城登录异常cookie丢失背景原因解决方案 背景 公司让用uniapp开发一个app 其中用webview嵌入了一个商城,这个商城代码比较老是前后端不分离的,使用的是cookie进行的用户数据流转。实际过程中...

    背景

    公司一个uniapp开发的聊天系统, 其中用webview嵌入了一个商城,这个商城代码比较老是前后端不分离的,使用的是cookie进行的用户数据流转。实际过程中不管用户是否登录,只要进入到需要验证用户信息的页面就不停的跳登录框,不管用户是否已经登录过了。这个商城在H5浏览器上面运行是正常的。

    原因

    我觉得是uniapp 实现webview和原生还是有点区别的 原生是直接用了一个浏览器 uniapp 是用了浏览器然后里面嵌套了一个iframe 从而导致了问题的发生

    解决方案

    最最重要的一点 如果是打包app的,打成app cookie的问题就不存在,所以用不到本方案
    本方案仅仅适用于前后端不分离,而且接口都没有封装的那些老程序,如果您的商城是前后端分离,对接口进行了封装,请直接在封装的接口用一个命令把cookie 加进去就行,下面的方法比这个复杂多了 请不要使用。

    思路
    1、拦截所有的a标签跳转(因为是不分离的 a标签有时候就返回的是网页,还需要用户信息),把跳转地址上面加上用户信息
    给所有的form请求的地址加上需要的用户信息
    2、给所有的请求携带用户信息

    拦截a标签,给form地址加上需要的用户信息

    
    //这里要获取一下,防止那手特别快的 页面还没渲染完就点跑了 第一次的localStorage.setItem("storeUserId", theRequest.user_id);是在登录页完成的,请自行补充,尽量让修改后的程序结实一点
    var link_user_id = localStorage.getItem("storeUserId");
    if (!link_user_id) {
    	let url = window.location.search
    	var theRequest = new Object();
    	if (url.indexOf("?") != -1) {
    		var str = url.substr(1);
    		strs = str.split("&");
    		for (var i = 0; i < strs.length; i++) {
    			theRequest[strs[i].split("=")[0]] = unescape(strs[i].split("=")[1]);
    		}
    	}
    	link_user_id = theRequest.user_id
    	 localStorage.setItem("storeUserId", theRequest.user_id);
    }
    
    
    
    setUserId4store()//页面进入就为a标签加一次user_id
    $(document).ajaxStop(function() {//所有通信完成再为a标签加载一次user_id
    	setUserId4store()
    });
    document.onreadystatechange = function(){//页面加载完成再为a标签加载一次user_id
        if(document.readyState == 'complete'){
            setUserId4store()
        }
    }
    function setUserId4store() {
        
    	var link = document.getElementsByTagName("a")
    	var formlist=document.getElementsByTagName("form")
    // 	console.log("setUserId4store",formlist,link_user_id)
    	if (link_user_id) {
    		for (let i = 0; i < link.length; i++) {
    			let aElement = link[i]
    			aElement.addEventListener("click", function(e) {
    				stopADefault(e, this)
    			})
    		}
    		for (let i = 0; i < formlist.length; i++) {
    			let aElement = formlist[i]
    			console.log(aElement.action)
    			if (aElement.action.indexOf("?") != -1){
    		        aElement.action= aElement.action + "&user_id="+link_user_id
            	}else {
            	    aElement.action = aElement.action+ "?user_id="+link_user_id
            	}
    		}
    	}
    	
    	
    }
    
    function stopADefault(e, aElement) {
    	e.preventDefault();
    	if(aElement.attributes["href"]){
    	    	console.log('aElement.attributes["href"].nodeValue',aElement.attributes["href"].nodeValue)
    	if (aElement.attributes["href"].nodeValue.indexOf("?") != -1){
    		window.location.href = aElement.attributes["href"].nodeValue + "&user_id="+link_user_id
    	}else if(aElement.attributes["href"].nodeValue.indexOf("mobile") != -1){
    		window.location.href = aElement.attributes["href"].nodeValue + "?user_id="+link_user_id
    	}else if(aElement.attributes["href"].nodeValue.indexOf("history.go(-1)") != -1){
    		history.go(-1)
    	}
    	}
    
    }
    
    
    
    
    
    

    修改jquery 源码

    失败的尝试
    //document.cookie = “user_id=”+link_user_id+";path=/";这个不可行请不要使用 请使用下面的修改jquery 源码的方法 这样一劳永逸 当然如果贵公司没使用jquery 我就也帮不到你了
    如果贵公司所有通信是封装的,请改封装代码 不要改jquery 源码 走下面这步是不得已而为之的!!!!

    在jquery 源码里面搜索setRequestHeader
    然后找到如下一段代码 for (s in u.headers) w.setRequestHeader(s, u.headers[s]);
    在这段代码之后添加你要携带的信息 比我们公司 需要的key值名字是 user_id 值是link_user_id

    
    
    var link_user_id = localStorage.getItem("storeUserId"); // 获取link_user_id
    if (!link_user_id) { // 获取如果不存在 就从地址上面读取,这个最好是引入webview的时候拼在地址后面 这样第一次就能从这里读了
    	let url = window.location.search
    	var theRequest = new Object();
    	if (url.indexOf("?") != -1) {
    		var str = url.substr(1);
    		strs = str.split("&");
    		for (var i = 0; i < strs.length; i++) {
    			theRequest[strs[i].split("=")[0]] = unescape(strs[i].split("=")[1]);
    		}
    	}
    	link_user_id = theRequest.user_id
    	 localStorage.setItem("storeUserId", theRequest.user_id);
    }
    
    //下面这句是关键 如果您的代码在别的地方可以获取到你的信息 上面这部分不要也罢
    w.setRequestHeader("user_id",link_user_id);
    
    

    这样改完以后 每次请求的时候请求头都会带着你要的信息了 好像下面这样
    Accept: application/json, text/javascript, /; q=0.01
    Accept-Encoding: gzip, deflate
    Accept-Language: zh-CN,zh;q=0.9
    Connection: keep-alive
    Host:
    Referer:
    User-Agent: Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Mobile Safari/537.36
    user_id: 132 这里就是你带的
    X-Requested-With: XMLHttpRequest

    展开全文
  • 问题三:身份认证Cookie丢失问题 //5.0以上需要开启第三方Cookie存储 if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { CookieManager.getInstance().setAcceptThirdPartyCookies...

    问题一:ERROR, source file:///android_asset/www/build/vendor.js (1)

    Android StudioLog 记录中发现此错误信息,然后通过 Chromeinspect 工具查看到 Log 为:TypeError: Cannot read property 'setItem' of null {stack: (...),解决方案如下:

    // webview的设置中添加如下代码
    mWebView.getSettings().setDomStorageEnabled(true);
    mWebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);  //设置 缓存模式
    // 开启 DOM storage API 功能
    mWebView.getSettings().setDomStorageEnabled(true);
    //开启 database storage API 功能
    mWebView.getSettings().setDatabaseEnabled(true);
    //开启 Application Caches 功能
    mWebView.getSettings().setAppCacheEnabled(true);
    

    问题二:跨域问题

    mWebView.getSettings().setAllowFileAccess(true);
    mWebView.getSettings().setAllowFileAccessFromFileURLs(true);
    mWebView.getSettings().setAllowUniversalAccessFromFileURLs(true);

    问题三:身份认证Cookie丢失问题

    //5.0以上需要开启第三方Cookie存储
    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        CookieManager.getInstance().setAcceptThirdPartyCookies(mWebView, true);
    }

     

    展开全文
  • private static void loadWebView() { Platform.runLater(() -> { TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() { @Override public X509Certificate[] getAcceptedIssuers() ...
  • private void setWebViewCookie() {  CookieSyncManager.createInstance(this);  CookieManager cookieManager = CookieManager.getInstance();  cookieManager.acceptCookie();  S
  • 最近几天做了一个项目,是原生和界面混合开发的,...这里就需要给webView设置一个cookie,然后服务器用来判断用户是否在线状态,看了网上的好多教程,都是是 CookieSyncManager.createInstance(context); CookieManag
  • android webview 同步cookie的重要性

    千次阅读 2018-12-18 16:09:26
    本质:同步cookie的本质就是Http框架的cookiewebviewcookie不同,无法区别为同一个用户,使用统一持久化过的cookie有助于后台区别用户。 业务场景:做一个临时打卡系统,使用http框架请求后台接口,获取打卡...
  • react-native android webview cookie同步设置

    千次阅读 2018-05-30 11:53:34
    近期遇到一个项目,rn页面登录,调用webview h5需要验证是否登录,因此在android需要做cookie 同步,iOS本身已实现同步,可直接使用。对于不太了解android的小白,遇到不少坑。主要的方法:将此方法封装成模块,供rn...
  • android webview同步cookie

    2021-06-03 07:51:44
    这种情况在Android开发中比较常见,因为Android不会自动同步cookieWebView。做iOS开发则不用担心这个问题,因为iOS内部已经实现了cookie同步。本文将会介绍两种cookie同步的方式,并重点分析Web...
  • 混合开发难免遇到些这样那样的坑,前几天碰到一个cookie丢失的问题,跨域出现cookie,网上查了一下,解决方案很多,此贴只是为了记录,不再详述,见下面的两个帖子: WebViewCookie跨域问题 ...
  • webview添加cookie有时失效

    千次阅读 2014-07-11 19:09:46
    Passing cookie to webview In few following lines I will describe my solution, how to pass cookies from DefaultHttpClient to WebView component. I was following many tutorials, but cookies weren...
  • 安卓中原生与H5(webview)之间交互时cookie的同步

    万次阅读 热门讨论 2017-02-17 11:54:25
    最近的项目中使用了H5页面和原生之间的交互,主要是原生通过js调用webview来加载H5页面,但是在进行通信时,涉及到一个cookie同步的问题,如果没处理好,真的是问题多多,纠结了好久,遇到了不少坑,今天在这里记录...
  • 在微信WebView下的页面中登录后,关闭WebView返回后再次进入页面,发现登录态还存在,原因是微信不会主动清除cookie以及其他的缓存。 期望是关闭窗口后会清除cookie,重新进入页面过程中引导登录。在浏览器下cookie...
  • WebView调用loadUrl时候带上cookie信息

    千次阅读 2015-11-19 23:03:51
    项目中有一个界面是一个纯webview,为了让这个界面在发布后也可以随时修改样式,当时就没有选择传统的android xml的布局界面,而是选择跳转到一个html界面。但是这个html也不是一个静态页面,他的界面会根据用户不同...
  • 这两天遇到了保存在微信浏览器localStorage的数据丢失的问题,度娘得到的解释是webview销毁后数据就丢了,尝试通过保存在cookie中解决问题,仍未解决。最后放弃,数据通过接口保存在服务端了。 ...
  • Android 5.0以上使用原生WebView跳转H5,丢失参数,5.0以上版本的webview做了较大的改动, cookie同步操作可以自动同步,但是必须手动添加cookie支持。列入直接打开京东信用卡申请页面,会提示没有开启cookie. ...
  • @TOC微信小程序webview(安卓)兼容localStorage 和cookie 一.出现问题 最近一一个项目小程序webview页面使用到小程序穿过去的数据进行调用,在苹果的手机都是没有用问题的,一直好好的,后面测试拿来了国产的各大...
  • 在进行APP+H5混合开发的时候...这种情况在Android开发中比较常见,因为Android不会自动同步cookieWebView。做iOS开发则不用担心这个问题,因为iOS内部已经实现了cookie同步.本文就是一个小的事例,从登录到同步cookie
  •  一般用webview的时候都不会考虑Cookie问题,但是某些需求考虑到用户登录问题,所以就得考虑给webview设置Cookie.  我用的实现方式是将Cookie存放到 HashMap 并 保存到 SharedPreferences,然后再需要使用到的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 673
精华内容 269
关键字:

webview丢失cookie