• 前后端分类Cookie


    • 后端主要是提供 API, 用于存储用户信息以及验证. 数据库部署在 MLab 上, 利用 Mongoose 进行操作.

    • 当新用户注册时, 数据库会自动为新 user数据 设置一个 id, 我将这个 id 作为 cookie 返回给浏览器. 每当用户执行刷新界面, 关闭页面重新进入等操作时, 前端会自动向后端发起验证请求, 如果后端利用传来的 cookie , 能够在数据库中找到对应的用户信息, 则视为验证成功, 实现重新自动登录.

    • 如果是用户主动 logout, 则删除对应的 cookie, 不会再实现自动登录 (登录成功时, 也会设置对应的 cookie)

    • 后端部署在 heroku上, 前端运行在 localhost:3000上

    采坑:

    当用户主动退出, 刷新页面后, 用户又自动登录上, 说明 cookie 并没有删除. 查看浏览器中的 cookie, 发现在application -> localhost:3000 下并没有 cookie. 但在每次发起的请求头中, 是能看到 cookie 信息的

    原因:

    我曾经一直以为只要服务器设置了 cookie, 浏览器就是能够看到的. 但实际上 cookie 是与域名有关. 假设浏览器访问过A, B, C 当个域名, 每个服务器传回一个 cookie, 则在浏览器中记录了三个域名下的 cookie 信息. 但是在 application 下只能看到当前域名下的 cookie, 比如当前正访问 A 站, 则只能看到 A 站的 cookie, 访问 B 站时, 则显示的是 B 站的 cookie. 总之一句话, 肉眼看不到 cookie, 并不代表 cookie 没有存储在浏览器中.

    在这个项目中, 由于后端是运行在 heroku 域名下, 所以发回的 cookie 对应的是 heroku 域名, 而不是 localhost:3000, localhost:3000 本身也并没有设置 cookie 响应头. 这也就是为什么当我访问 localhost:3000时, 浏览器中看不到相应的cookie, 而实际上 userid 这个 cookie 是存在, 只有在我访问 heroku 域名时, 才肉眼可见.

    解决办法:

    根据上述原因, 那么我就需要再用户主动 logout 时, 删除 heroku 域名下 userid 这个 cookie 才可以.

    首次尝试的方法, 就是用 document.cookie 获取浏览器中存储的所有cookie, 找到 key=userid 并删除. 然后该方法并不奏效, 这又是为什么呢?

    因为我当前访问的是 localhost:3000, document.cookie 实际获取的是当前域名下对应的所有cookie, 因为 localhost:3000并没有设置 cookie 响应头, 所以 document.cookie 返回的是空值. 想想也很自然, 如过任何一个前端网站, 都可以通过 document.cookie 获取到其他域名的 cookie, 那世界岂不乱套了!

    所以唯一的解决办法就是, 当用户 logout 时, 向 herohu 域名发起 logout 请求, 后端收到请求后, 设置响应头

    res.cookie("userid", "", { expires: new Date(0)});
    

    意在告诉浏览器, 请把' 我( heroku域名)' 发给'你(浏览器)'的 userid 这个 cookie 的有效期设置为过去的某个时间. 当浏览器接收到响应头后, userid 这个 cookie 就失效了, 刷新页面后就不会再自动登录了.

  • 相关阅读:
    Sql Server常见错误
    sql server复制需要有实际的服务器名称才能连接到服务器
    学习WCF必备网址
    利用Httphandler、UserControl 输出HTML片段
    SQL点滴—性能分析之执行计划
    我的WCF开发框架简化版及基于NET.TCP传输方式的实现
    数据库优化建议
    实现jQuery扩展总结
    【模板】zkw线段树
    洛谷 P1960 列队
  • 原文地址:https://www.cnblogs.com/IT-TOP/p/10636006.html
Copyright © 2020-2023  润新知