OpenHarmony开源社区
直播中

ss

7年用户 8762经验值
擅长:电源/新能源 制造/封装 RF/无线
私信 关注
[问答]

webview组件能获得cookie数值,但app进程一结束cookie的数值就失效是为什么?

做一个webview组件,思路如下:
用户首次登陆,cookie为空,webivew.load(url),然后通过onPageLoaded获得cookie,再setCookie,下次用户二次登陆可以直接登陆而不用输入账号密码。
代码如下:
url1 = "xxxxxxxx";
webView = (WebView) findComponentById(ResourceTable.Id_webview);
webView.getWebConfig().setJavaScriptPermit(true);
cookieStore = CookieStore.getinstance();
cookieStore.setCookieEnable(true);
cookieStore.setCrossDomainCookieEnable(webView, true);
if (cookieStore.getCookie(url1) == null) {
    webView.load(url1);
} else {
    String[] cookies = cookieStore.getCookie(url1).split(";");
    for (int i = 0; i < cookies.length; i++) {
        cookieStore.setCookie(url1,cookies[i]);
    }
    cookieStore.persist();
    webView.load(url1);
}
webView.setWebAgent(new WebAgent() {
    @Override
    public boolean isNeedLoadUrl(WebView webView, ResourceRequest request) {
        return true;
    }
    @Override
    public void onPageLoaded(WebView webView, String url) {
        super.onPageLoaded(webView, url);
        cookieStore.setCookieEnable(true);
        cookieStore.setCrossDomainCookieEnable(webView, true);
        cookieStore.getCookie(url1);
        cookieStore.persist();
    }
});
在setCookie中能看到key=value值,但是app进程一结束,cookie就失效。此问题困扰我好几天,望各位大神不吝赐教!谢谢!

回帖(2)

ss

2022-3-25 10:38:00
你读取加载url中的cookie 他是实时的 不是存在本地的,所以你第二次打开的时候回cookie就失效了
第一步实现登录功能,然后返回cookie相关参数,在然后将cookie保存在本地中
第二步在加载时候(isNeedLoadUrl)将cookie 拼接传给后台,
    //设置cookie
                ohos.agp.components.webengine.CookieStore mCookieStore = ohos.agp.components.webengine.CookieStore.getInstance();
                mCookieStore.setCookieEnable(true);
                mCookieStore.setCookie(url, "Domain="+"1111");
                mCookieStore.setCookie(url, "Path=/");
                mCookieStore.setCookie(url, "Value=00000");
     //获取cookie
                ohos.agp.components.webengine.CookieStore mCookieStore = ohos.agp.components.webengine.CookieStore.getInstance();
                String cookiestr=mCookieStore.getCookie(url);
                HiLogUtils.PrintLog(cookiestr);
设置获取cookie代码如下
public class WebviewSlice extends AbilitySlice {
    private static final String EXAMPLE_URL = "https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=android%E7%89%88%E6%9C%AC%E5%8F%B7&fenlei=256&oq=android%25E7%2589%2588%25E6%259C%25AC%25E4%25BB%25A3%25E5%258F%25B7&rsv_pq=a1072f0e00139b17&rsv_t=1790Ohd03bVT21DCnl7FeJacxdjk58eJxGpr4r41zM6bzt8pHm62TUYAMD4&rqlang=cn&rsv_dl=tb&rsv_enter=0&rsv_btype=t&rsv_sug3=110&rsv_sug1=63&rsv_sug7=100&rsv_sug2=0&inputT=283&rsv_sug4=1617";
    @Override
    protected void onStart(Intent intent) {
        super.onStart(intent);
        setUIContent(ResourceTable.Layout_webview_slice);
        WebView webView = (WebView) findComponentById(ResourceTable.Id_webview);
        webView.getWebConfig().setJavaScriptPermit(true);  // 如果网页需要使用JavaScript,增加此行;如何使用JavaScript下文有详细介绍
        webView.setWebAgent(new WebAgent() {
            @Override
            public boolean isNeedLoadUrl(WebView webView, ResourceRequest request) {
                if (request == null || request.getRequestUrl() == null) {
//                    LogUtil.info(TAG,"WebAgent isNeedLoadUrl:request is null.");
                    return false;
                }
                String url = request.getRequestUrl().toString();
                //设置cookie
                ohos.agp.components.webengine.CookieStore mCookieStore = ohos.agp.components.webengine.CookieStore.getInstance();
                mCookieStore.setCookieEnable(true);
                mCookieStore.setCookie(url, "Domain="+"1111");
                mCookieStore.setCookie(url, "Path=/");
                mCookieStore.setCookie(url, "Value=00000");
                if (url.startsWith("http:") || url.startsWith("https:")) {
                    webView.load(url);
                    return false;
                } else {
                    return super.isNeedLoadUrl(webView, request);
                }
            }
            @Override
            public void onPageLoaded(WebView webView, String url) {
                super.onPageLoaded(webView, url);
                //获取cookie
                ohos.agp.components.webengine.CookieStore mCookieStore = ohos.agp.components.webengine.CookieStore.getInstance();
                String cookiestr=mCookieStore.getCookie(url);
                HiLogUtils.PrintLog(cookiestr);
            }
        });
        webView.load(EXAMPLE_URL);
    }
}

举报

ss

2022-3-25 10:38:21
我之前也遇到同样的问题,最后是取出cookie保存数据库,然后重启app时从数据库提取,来实现的。按理说是有保存cookie的api的但是没有效果,不知道现在是不是好使了。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分