V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
haiyang416
V2EX  ›  PHP

如何通过 PHP 删除在微信内置浏览器中用 Javascript 创建的 cookie?

  •  
  •   haiyang416 · 2017-04-13 21:40:51 +08:00 · 4983 次点击
    这是一个创建于 2570 天前的主题,其中的信息可能已经有所发展或是发生改变。
    一个微信商城类的项目,用户浏览页面的时候可以通过点击加号和减号按钮添加和删除商品。
    购物车的数据都是使用 document.cookie 写入 cookies 里面的。
    现在需要通过 PHP 在后端清空购物车的数据,完成的代码在 Chrome 和 Firefox 等浏览器都可以正常工作,唯独微信内置浏览器(安卓版)不管怎么设置 cookie 过期时间都没有任何作用, Google 了一下相关的关键词,也没有找到什么有价值的内容。
    目前已陷入僵局,请问各位有没有遇到类似的问题,最后是怎么解决的?
    第 1 条附言  ·  2017-04-16 06:11:29 +08:00
    @Mitt @iot 问题暂时解决了,最后还是把 cookie 的操作放到前端去了。先把页面应该有的商品的编号放到一个 js 数组里,在页面加载完毕之后直接删除所有未在编号数组里的商品。

    感谢帮助分析问题的朋友们。

    另外,并是不是所有商城都需要统计购物车数据和推荐算法的,结帖。
    33 条回复    2017-04-16 06:08:26 +08:00
    gouchaoer
        1
    gouchaoer  
       2017-04-13 21:48:28 +08:00 via Android
    x5 的 bug ? x5 还有一些别的 bug 来着。。。
    cxbig
        2
    cxbig  
       2017-04-13 21:54:47 +08:00
    简单来说不能有效操作对方 cookies 的话,放 server 端处理行不行?

    我们的项目比较复杂,都是专有 API 处理添加删除操作,返回更新的的购物车信息。
    各种税、打折等计算都是 server 端完成的。
    haiyang416
        3
    haiyang416  
    OP
       2017-04-13 22:02:30 +08:00 via Android
    @gouchaoer 搜索结果都说是 x5 的问题,不过我也不太确定。

    @cxbig 这个代码是同事以前写的,数据都放到 cookie 里面,现在这个不是主要需求,全部重写的话时间上来不及,如果实在没办法,也只能先挂起以后再改了。
    yangqi
        4
    yangqi  
       2017-04-13 22:03:46 +08:00
    实在不行就把键值写为空呗
    haiyang416
        5
    haiyang416  
    OP
       2017-04-13 22:05:57 +08:00 via Android
    @yangqi 也试过,没用。
    shiny
        6
    shiny  
       2017-04-13 22:07:39 +08:00
    确定 path/domain 之类的都一致?
    yangqi
        7
    yangqi  
       2017-04-13 22:09:17 +08:00
    @haiyang416 随便写的无效的值也不行?那最开始是怎么赋值的
    haiyang416
        8
    haiyang416  
    OP
       2017-04-13 22:15:51 +08:00 via Android
    @yangqi 都是直接在页面上直接用 document. cookie 操作的,后端目前只是读取 $_COOKIE 获得对应的值。
    haiyang416
        9
    haiyang416  
    OP
       2017-04-13 22:18:35 +08:00 via Android
    @shiny 嗯,专门看过, domain 和 path 都没错,电脑上的各种浏览器都没有问题。
    唯独微信完全不理会 setcookie 设置的内容。
    lcorange
        10
    lcorange  
       2017-04-13 23:29:11 +08:00
    这样呢,再写个新接口,针对微信是设置 cookie 内容,微信的话就多发几次请求,对整体业务没影响
    guokeke
        11
    guokeke  
       2017-04-13 23:31:57 +08:00 via Android
    返回段 js 代码如何?
    jarlyyn
        12
    jarlyyn  
       2017-04-13 23:34:58 +08:00
    实在不行把购物车放 session 里呗
    Mitt
        13
    Mitt  
       2017-04-13 23:56:36 +08:00
    实在没辙就临时在前端删 cookie 咯 应该是 BUG 或者 “特性”
    greatonce
        14
    greatonce  
       2017-04-14 00:01:20 +08:00
    document.cookie 是在客户端执行的, php 设置 cookie 是在服务端执行的,

    后端 php 先在服务器上解析运行完,把客户端代码返回给浏览器,在浏览器中执行客户端代码,

    你顺序弄错了, php 怎么也不会处理的了客户端设置的 cookie 。
    Mitt
        15
    Mitt  
       2017-04-14 00:29:19 +08:00
    @greatonce cookie 是可以被服务端返回同名 cookie 覆盖掉的 比如服务器把 cookie 时间设置成以前的时间 就会使 cookie 到期而被删除 而提交时带的那个 cookie 都是带了 session 的 这个一般也是服务端返回来的
    Mitt
        16
    Mitt  
       2017-04-14 00:31:54 +08:00
    @Mitt 纠正一点 不是提交时带的 cookie 脑子不好使了。
    greatonce
        17
    greatonce  
       2017-04-14 01:10:18 +08:00
    @Mitt 当然可以同名

    服务端设置的 cookie 是从 HTTP header 中设置的,

    而浏览器 document.cookie 是在页面的脚本里面设置的,

    浏览器接收到一个 response 的时候会先处理 HTTP header ,(也就是在这里浏览器会根据 response header 设置各种参数,包括 cookie )

    然后解析 DOM 和运行 js 脚本,(其中也包括对 document.cookie 的处理)

    这两个顺序不一样, HTTP header 在先(也就是 php 的服务端在先), js 的 document.cookie 在后,你在服务端的设置覆盖不了客户端的设置,

    至于里面说在其它浏览器里可以做到,可能是浏览器解析的时候没有用你服务端给的过期时间,不同的浏览器版本会有不同的差异


    -----



    解决这个问题,我不知道楼主具体是在用什么样的环境,不知道为什么客户端的购物车为什么要用 cookie 存储商品,为什么不提交到服务端,或者在用第三方的系统,如果你有权限处理客户端,可以用 localStorage
    slixurd
        18
    slixurd  
       2017-04-14 01:18:25 +08:00   ❤️ 1
    @greatonce
    客户端保存购物车状态是很正常的实现吧
    否则服务器就是有状态的,既然有状态,要么服务器自己在内存存着,要么通过其他存储来实现,例如数据库 /KV
    当然也有的电商就是保存在服务器的,可以实现各端共享购物车......
    Mitt
        19
    Mitt  
       2017-04-14 01:34:54 +08:00
    @greatonce 你可能理解错了。 他本地操作 cookie 是有条件的 比如 你点击加入购物车以后添加 cookie 并不是访问页面就会加 cookie 所以并不会发生冲突
    cnwtex
        20
    cnwtex  
       2017-04-14 03:58:58 +08:00
    ∵ 我相信微信不会蠢到出这种 bug
    ∴ 楼主自己蠢
    greatonce
        21
    greatonce  
       2017-04-14 04:00:24 +08:00
    @Mitt 我没有说 “有冲突” 啊,只是后一个操作会覆盖之前的操作。

    服务端之前设置的 cookie ,在客户端页面上可以被重新设置一个值覆盖掉。
    greatonce
        22
    greatonce  
       2017-04-14 04:04:18 +08:00   ❤️ 1
    @slixurd 保存在客户端肯定不是一个好的方案,就算你的应用只支持一个客户端,也不是好的方法,

    就像你说的客户端有很多种,你只在安卓手机的客户端里添加了商品,打开 ios 发现没有这个商品了,

    就算支持一个客户端,那天你的商品下架了,而你客户端里还显示这个商品可以购买,而不提示已经下架,

    当用户支付的时候发现根本买不了,这种用户体验很不好,这种肯定是放到服务端的,所以不清楚是什么需求,为什么这么做。
    Mitt
        23
    Mitt  
       2017-04-14 06:16:07 +08:00 via iPhone
    @greatonce 然而服务器保存只有多端需求才会有 单端本地 cookie 就足够了 至于商品下架 参考淘宝 你存的只是 id 购物车显示的时候服务器返回商品状态就是了
    iot
        24
    iot  
       2017-04-14 06:21:41 +08:00   ❤️ 1
    我以前本地存储数据时候是有 localStorage 用 localStorage, 没有才用 cookie

    x5 应该支持 localStorage 吧,并且和 cookie 的接口一样 get put remove clear
    Mitt
        25
    Mitt  
       2017-04-14 06:27:33 +08:00   ❤️ 1
    @greatonce 我觉得你自己的观点或者表述有点问题 你刚开始说 "php 怎么也不会处理的了客户端设置的 cookie 。" 我回复了可以通过同名 cookie 达到覆盖和删除的效果 而你后面反驳我的观点 我又补充了"客户端添加 cookie 是有条件的: 添加购物车操作才会添加 cookie" 再到后面又说 "服务端之前设置的 cookie ,在客户端页面上可以被重新设置一个值覆盖掉。" 你的观点有点矛盾 或者说你还是没理解我说的 只是纯属在反驳我的观点 希望能看一下刚开始的问题和回答 不要继续歪下去

    ------

    现在就是在客户端不会立即重新覆盖 cookie 的情况下 服务端返回的 cookie 无法完成覆盖和删除的操作 只发生在微信内置浏览器里 所以微信内置浏览器有 BUG 就成了可能性之一 LZ 说这个是以前同事写的 所以现在就是想以“最简单”的方式去解决这个问题 所以提那么多后端解决方案明显不符合简单的概念啊
    Mitt
        26
    Mitt  
       2017-04-14 07:01:53 +08:00
    @haiyang416 可以尝试不要将值设为空 而是设为一个其他值 看看本地有没有改变 cookie 值
    greatonce
        27
    greatonce  
       2017-04-14 07:49:30 +08:00
    @Mitt

    我之前说的

    “你顺序弄错了, php 怎么也不会处理的了客户端设置的 cookie 。”

    我说这句的时候是有前置条件,就是 “顺序弄错了”

    header 返回的 cookie 客户端能不能改掉?

    而你只看后面那句 “ php 怎么也不会处理客户端设置的 cookie ”
    shew2356
        28
    shew2356  
       2017-04-14 10:26:44 +08:00
    域没用对吧!
    Mitt
        29
    Mitt  
       2017-04-14 10:42:14 +08:00
    @greatonce 在我这边看来 我认为你第一句 “你顺序弄错了” 已经否定了 “添加购物车才会添加 cookie ” 这个前置条件 所以 话题终止 吃了文化的亏 (逃
    pubby
        30
    pubby  
       2017-04-14 10:45:45 +08:00 via Android
    是不是微信的问题,你在页面上同样用 js 删 cookie ,在微信里试试就知道啊
    reus
        31
    reus  
       2017-04-14 13:35:56 +08:00
    不放服务器端,怎么做统计?怎么根据浏览记录、加购物车记录做推荐?
    iot
        32
    iot  
       2017-04-16 01:57:25 +08:00
    haiyang416
        33
    haiyang416  
    OP
       2017-04-16 06:08:26 +08:00 via Android
    @Mitt @iot 问题暂时解决了,最后还是把 cookie 的操作放到前端去了。先把页面应该有的商品的编号放到一个 js 数组里,在页面加载完毕之后直接删除所有未在编号数组里的商品。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2620 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 01:46 · PVG 09:46 · LAX 18:46 · JFK 21:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.