悠哉的农民
悠哉的农民
  • 发布:2020-11-19 11:16
  • 更新:2020-12-21 10:47
  • 阅读:1184

【报Bug】【重大bug】uniapp使用最新版hbuilder打包集成X5依旧无法共享cookies

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Windows

PC开发环境操作系统版本号: 1

HBuilderX类型: 正式

HBuilderX版本号: 2.9.10

手机系统: Android

手机系统版本号: Android 11

手机厂商: 小米

手机机型: 55

页面类型: vue

打包方式: 云端

项目创建方式: HBuilderX

示例代码:

代码说明:
X5内核模式下,传入远程验证码url到uniapp页面,cookies无法设置

<u-form-item label="验证码">
<u-input placeholder="请输入验证码" type="text" v-model="form.captchaImg" />
<view slot="right">
<u-image width="128rpx" height="40rpx" :src="catchaUrl"></u-image>
</view>
</u-form-item>

操作步骤:

首先X5进行打包,首次启动有时候还未加载X5内核。这时候通过原生webview登陆了账号,然后request是可以共享cookies的。退出应用重新进入,X5内核加载完毕,webview登录状态变成未登录。这时候request依旧是有cookies状态。当在X5内核的webview中登录后,request就无法共享cookies了。

预期结果:

正常请求

实际结果:

无法携带cookies,request请求为未登录状态

bug描述:

之前描述的:https://ask.dcloud.net.cn/question/108639,但是request还是无法共享cookies;还有就是X5内核模式下,验证码图片无法设置cookies,所以我猜测到底是X5内核无法携带cookies,还是压根没有设置cookies。

2020-11-19 11:16 负责人:DCloud_Android_DQQ 分享
已邀请:
DCloud_Android_DQQ

DCloud_Android_DQQ

你提供一下 复现问题的代码 或者你留一下qq. 提供一下 app id

DCloud_Android_DQQ

DCloud_Android_DQQ

我用最新的版本alpha. 回归X5 cookie同步的测试用例。 测试没有问题。

你提供一下你的app信息。我们看一下。

  • 悠哉的农民 (作者)

    打包appid:UNI3952F0F 测试账号:llllll 密码:llllll

    2020-11-22 14:19

  • DCloud_Android_DQQ

    回复 悠哉的农民: 测试账号已登入。 操作步骤呢?

    2020-11-23 11:26

  • 悠哉的农民 (作者)

    回复 DCloud_Android_DQQ: 新装APP-点击底部插件按钮随意安装一个新闻插件,在首页点击刚才安装的插件首次点击是不需要登陆账号的因为是试用就可以进入,退出来后再次点击提示需要登陆账号,这时候登录账号后重新来到首页点击刚才的插件是可以进入的。我们完全退出APP后重新进入APP,就无法再打开刚才的插件了,一直提示未登陆状态,

    2020-11-23 11:35

  • 悠哉的农民 (作者)

    回复 DCloud_Android_DQQ: 我测试出来发现,X5内核和原生内核他们的cookie是不共享的,而request取的cookies是从原生里取得。所以造成了X5登录挤下线了原生内核的登录,然后造成request无法成功请求。你们可以查查看

    2020-11-23 11:41

  • 悠哉的农民 (作者)

    回复 DCloud_Android_DQQ: plus.navigator.getCookie();我用的这个命令取得cookies,发现的这个问题。然后X5内核能否做到首次加载成功后立即使用X5而不是需要重新打开APP的那种。

    2020-11-23 11:44

  • 悠哉的农民 (作者)

    回复 DCloud_Android_DQQ: 测试好后麻烦回复一下哈,如果是我自己的问题我好去修复

    2020-11-23 12:03

  • DCloud_Android_DQQ

    回复 悠哉的农民: 我这边暂时没能发现有什么问题。 你最好从你那边逻辑上也排查一下

    2020-11-23 15:35

DCloud_Android_DQQ

DCloud_Android_DQQ

1 X5内核和原生内核他们的cookie是不共享的. 差不多是这样,两个内核是分开储存的。

但是,request的时候会对二者进行合并。 取并集。

DCloud_Android_DQQ

DCloud_Android_DQQ

2 我这边测试话,登录的时候 没有监听到cookie写入操作。 你登录的cookie 操作是如何实现的。

  • 悠哉的农民 (作者)

    public function login($param)

    {

    $data = [];

    $data['user_name'] = htmlspecialchars(urldecode(trim($param['user_name'])));

    $data['user_pwd'] = htmlspecialchars(urldecode(trim($param['user_pwd'])));

    $data['verify'] = $param['verify'];

    $data['openid'] = htmlspecialchars(urldecode(trim($param['openid'])));

    $data['col'] = htmlspecialchars(urldecode(trim($param['col'])));


        if (empty($data['openid'])) {  
    if (empty($data['user_name']) || empty($data['user_pwd'])) {
    return ['code' => 1001, 'msg' => '请填写必填项'];
    }

    if ($GLOBALS['config']['user']['login_verify'] ==1 && !captcha_check($data['verify'])) {
    return ['code' => 1002, 'msg' => '验证码错误'];
    }

    $pwd = md5($data['user_pwd']);
    $where = [];

    $pattern = '/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/';
    if (!preg_match($pattern, $data['user_name'])) {
    $where['user_name'] = ['eq', $data['user_name']];
    } else {
    $where['user_email'] = ['eq', $data['user_name']];
    }

    $where['user_pwd'] = ['eq', $pwd];
    } else {
    if (empty($data['openid']) || empty($data['col'])) {
    return ['code' => 1001, 'msg' => '请填写必填项'];
    }
    $where[$data['col']] = $data['openid'];
    }
    $where['user_status'] = ['eq', 1];
    $row = $this->where($where)->find();

    if(empty($row)) {
    return ['code' => 1003, 'msg' => '查找用户信息失败'];
    }

    if($row['group_id'] > 2 && $row['user_end_time'] < time()) {
    $row['group_id'] = 2;
    $update['group_id'] = 2;
    }

    $random = md5(rand(10000000, 99999999));
    $ip = sprintf('%u',ip2long(request()->ip()));
    if($ip>2147483647){
    $ip=0;
    }
    $update['user_random'] = $random;
    $update['user_login_ip'] = $ip;
    $update['user_login_time'] = time();
    $update['user_login_num'] = $row['user_login_num'] + 1;
    $update['user_last_login_time'] = $row['user_login_time'];
    $update['user_last_login_ip'] = $row['user_login_ip'];

    $res = $this->where($where)->update($update);
    if ($res === false) {
    return ['code' => 1004, 'msg' => '更新登录信息失败'];
    }

    //用户组
    $group_list = model('Group')->getCache('group_list');
    $group = $group_list[$row['group_id']];

    cookie('user_id', $row['user_id'],['expire'=>2592000] );
    cookie('user_name', $row['user_name'],['expire'=>2592000] );
    cookie('group_id', $group['group_id'],['expire'=>2592000] );
    cookie('group_name', $group['group_name'],['expire'=>2592000] );
    cookie('user_check', md5($random . '-' .$row['user_name'] . '-' . $row['user_id'] .'-'.request()->ip() ),['expire'=>2592000] );
    cookie('user_portrait', mac_get_user_portrait($row['user_id']),['expire'=>2592000] );

    return ['code' => 1, 'msg' => '登录成功'];
    }

    2020-11-23 13:48

  • 悠哉的农民 (作者)

    cookie肯定写入了啊,没有监听到cookie写入操作的话webview应该也不可能可以进行其他操作,如点击修改资料。

    2020-11-23 13:49

  • DCloud_Android_DQQ

    回复 悠哉的农民: 你没明白我的意思。 我的意思是 登录的时候 写入的cookie 是写入到浏览器的中 还是 request 写入的

    2020-11-23 15:02

  • 悠哉的农民 (作者)

    回复 DCloud_Android_DQQ: webview登录后后端写入的啊。写入到浏览器中的。

    2020-11-23 17:14

  • 悠哉的农民 (作者)

    回复 DCloud_Android_DQQ: 我发现X5内核下无法使用plus.navigator.setCookie和plus.navigator.removeAllCookie。你们那边看下是不是这个的原因造成的。

    2020-11-23 17:52

  • DCloud_Android_DQQ

    回复 悠哉的农民: 好的。 我确认一下 这个两个api的情况 回复你

    2020-11-24 11:06

  • DCloud_Android_DQQ

    回复 悠哉的农民: 应该不只是 x5内核下不支持吧。 uni-app 应用是 普通浏览器内核下也不支持 cookie 操作。这是一个 已知的缺陷。 目前正在开发中

    2020-11-24 12:37

  • 悠哉的农民 (作者)

    回复 DCloud_Android_DQQ: 我用evalJS可以在webview里成功获取到更新的cookies,但是plus.navigator.getCookie();获取的还是旧的cookies。

    2020-11-24 16:15

  • 悠哉的农民 (作者)

    回复 DCloud_Android_DQQ: <template>

    <view class="">

    <web-view :webview-styles="webviewStyles" :src="url" ></web-view>

    </view>

    </template>


    <script>

    var box,currentWebview;

    export default {

    data() {

    return {

    webviewStyles: {

    progress: {

    color: '#00aaff',

    top:"0",

    bottom:'0'

    },

    zindex:1,

    videoFullscreen:'landscape-primary'

    },

    url:'http://user.688ing.com/index.php/user/index.html'

    }

    },

    onReady() {

    currentWebview = this.$scope.$getAppWebview();

    box = currentWebview.children()[0];

    box.onloaded = function(){

    var a = plus.navigator.getCookie();

    console.log(a);

    box.evalJS("document.addEventListener('plusready',function(){plus.storage.setItem('UserCookies',document.cookie);alert(document.cookie);}, false);");

    }

    }

    }

    </script>


    <style>

    </style>

    2020-11-24 16:15

  • 悠哉的农民 (作者)

    回复 DCloud_Android_DQQ: 我用evalJS可以在webview里成功获取到更新的cookies,但是plus.navigator.getCookie();获取的还是旧的cookies。代码如上。appid:UNI3952F0F这个已经重新打包,只需要在我的登录就可以调试看到了

    2020-11-24 16:18

  • DCloud_Android_DQQ

    回复 悠哉的农民: plus.navigator.getCookie(); 这个函数是有问题的。 这是一个已知缺陷。 你是通过这个函数获取的cookie吗

    2020-11-24 17:24

DCloud_Android_DQQ

DCloud_Android_DQQ

明确存在一个问题 plus.navigator.getCookie(); 这个函数是有问题,不支持X5内核。 这是一个已知缺陷。

  • 悠哉的农民 (作者)

    那这么说X5内核下既不能设置cookies也不能查询cookies,所以X5不就是不能处理request的cookies吗

    2020-11-25 18:26

  • DCloud_Android_DQQ

    回复 悠哉的农民: 上个版本修复的问题是 uni.request 和 x5浏览器内核的cookie 共享。 如果需要我可以提供相关的测试用例给你。 针对 plus.navigator.getCookie(); 无法获取x5cookie 的问题 我们也已经在修复了。 预计最近版发布。

    2020-11-26 10:52

  • 悠哉的农民 (作者)

    回复 DCloud_Android_DQQ: 示例来一份吧,我看看是不是我手机的问题

    2020-11-26 12:15

  • 悠哉的农民 (作者)

    回复 DCloud_Android_DQQ: 现在情况是X5登陆账号后登陆其他的账号依旧是之前的账号,比如先登录LLLLLL再退出登录QQQQQQ,request使用的还是llllll的cookies

    2020-11-26 13:33

DCloud_Android_ST

DCloud_Android_ST

HX3.0.0已修复

该问题目前已经被锁定, 无法添加新回复