使用带有cookies javascript的decodeURI

2024-01-26

我手头的问题是我需要一个变量来跟踪我的所有 cookie,以便我可以将该变量中的字符串拆分为一个数组,然后从那里解析该字符串。我想知道为什么下面的简单代码不适合我?

var count = 0;          //keeps track of how many times this page has been visited
var lastVisit = new Date();     //records the last visit date in UTC format (or extra-challenge: in a user-friendly format like "Tuesday 10/12/2013 at 9:34:50")
var exDate  = new Date(lastVisit.getTime() + 30000);
var savedData = decodeURI(document.cookie);  //contains cookie contents

document.cookie = encodeURI("count=" + count.toString() + "; expires=" + exDate.toUTCString());

我需要发生的是每当我设置一个 cookie 将其添加到 savingData 变量时,我无法弄清楚为什么这种情况没有发生。谢谢


您不应该对“expires=”进行编码。它会变成“expires%3D”,这不是你想要的。 除此之外,使用“encodeURI”可能不是一个好主意,因为它不编码“;”和 ',' 根据需要。

您可以使用encodeURIComponent对cookie值进行编码,但使用escape()对cookie值进行编码在技术上是正确的。

So...

document.cookie = "count=" + encodeURIComponent(count.toString()) + "; expires=" + exDate.toUTCString();

...应该做你想做的事。
cookie 由几个部分组成;我们最感兴趣的是名称、价值和有效期。

(官方回答完)


让我们澄清一下关于 cookie 编码的困惑

如果有任何疑问,请联系 RFC,不要只选择在网络上找到的任何看起来有效的内容。

cookie 名称的类型token https://www.rfc-editor.org/rfc/rfc2616#page-17,这意味着其中只允许使用以下值:
0x21-0x27, 0x2A-0x2B, 0x2D-0x2E, 0x30-0x39, 0x41-0x5A, 0x5E-0x7A and 0x7E.
换句话说:以下值应该进行百分比编码:
0x00-0x20, '(', ')', ',', '/', ':', ';', '<', '=', '>', '?', '@', '', '[', ']', '{', '}' and 0x7F-0xFF.

cookie 值的类型cookie 八位组 https://www.rfc-editor.org/rfc/rfc6265#page-9,这意味着其中只允许使用以下值:
0x21、0x23-0x2B、0x2D-0x3A、0x3C-0x5B、0x5D-0x7E.
换句话说:以下值应该进行百分比编码:
0x00-0x20, 0x22, ',', ';', '' and 0x7F-0xFF.

现在,到期日期是使用 toUTCString() 进行编码的,正如您所做的那样。
结果看起来像这样:2021 年 6 月 9 日星期三 10:18:14 GMT- 所以它将包含一个逗号。但!除了 cookie 名称和 cookie 值字符串之外,您不应该对任何内容进行编码。

Note: W3学校 http://www.w3schools.com/jsref/jsref_escape.asp说 escape() 在 JavaScript 1.5 中已被弃用,但从技术上来说,对 cookies 使用encodeURI() 或encodeURIComponent() 是不正确的。对 cookie 使用 escape() 从技术上来说是正确的。

RFC 6265 第 5.4 节 https://www.rfc-editor.org/rfc/rfc6265#section-5.4明确指出:

注意:尽管有它的名字,cookie-string实际上是一个序列
八位位组,而不是字符序列。转换 cookie 字符串
(或其组成部分)转换为字符序列(例如,
呈现给用户),用户代理可能希望尝试使用
用于解码八位位组序列的 UTF-8 字符编码 [RFC3629]。
然而,这种解码可能会失败,因为并非每个序列 八位字节是有效的 UTF-8。

由于decodeURIComponent()适用于unicode字符串,并且会阻塞0x00和0xFF之间的字节值,因此它们can not安全使用。 另一方面,unescape() 是not对于字符串,但对于 8 位字节序列,又名。octets,但前提是您的字节序列不包含 unicode 字符。

如果您的 cookie 值包含 unicode 字符,您should但是,使用encodeURIComponent()/decodeURIComponent(),但您还应该捕获任何异常,因为服务器可能不会准确地向您发送您想要接收的内容。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用带有cookies javascript的decodeURI 的相关文章

随机推荐

  • 提取“$@”中最后一个参数之前的参数

    我正在尝试创建一个 Bash 脚本 它将将从命令行给出的最后一个参数提取到一个变量中以在其他地方使用 这是我正在编写的脚本 bin bash compact archive and compact file folder s eval LA
  • 删除 NSTokenFieldCell 的回调

    我有一个 NSTokenField 和 NSTokenFieldCell 代表托管对象 当我通过键入创建一个新的 NSTokenFieldCell 时 我的 NSTokenField 的委托 NSArrayController 将使用以下方
  • 使用 mysqldump 忽略 mysql 数据库备份中的“视图”

    我需要忽略数据库中的所有视图并使用 mysqldump 进行备份 目前我正在使用以下选项 ignore table view1 ignore table view2 ignore table view3 有没有什么方法可以在不指定所有 视图
  • Spring boot项目中定义的全局变量和应用程序变量

    我正在尝试使用 spring 和 spring boot 开发微服务 在我的项目中 我正在将整体架构转换为面向服务的架构 项目包含 20 个微服务 我需要设置应用程序变量和全局变量 我有与此相关的困惑 我在这里添加这些困惑 可以在 appl
  • reST:具有任意标题的内联链接?

    如果我定义了内部超链接目标 如何使用任意文本作为链接标题链接到它 例如 This is a very long internal link target A short reference to the very long link tar
  • Web API 帮助页面 - 用户特定的响应类型

    我正在开发一个 API 它根据用户输出不同的响应 并且我当前正在使用 ResponseType 属性来描述返回的响应类型 但这仅允许我指定一种类型的响应 该响应类型在用户 有什么方法可以自定义帮助页面以显示用户将获得的响应类型吗 HelpP
  • HTML 语法高亮 sublime 3 Typescript

    我正在使用 TypeScript 和 Sublime 3 如何在模板属性中添加 HTML 高亮显示 注意 我已经在使用 Microsoft TypeScript 包 看看现在它没有突出显示 这是一个快速修复 仍然可以使用您已安装的TypeS
  • 如何使用 facebook sdk 在 LoginButton 中设置权限“publish_actions”?

    我想在 Facebook 时间线上发布一张照片 我正在使用 LoginButton 来设置权限 publish actions 但是我收到错误消息 com facebook FacebookException Cannot pass a p
  • 在 Javascript onClick 事件中传递参数

    我试图在 onclick 事件中传递一个参数 下面是示例代码 div div
  • Android TTS onUtteranceCompleted 回调未被调用

    我试图让 Android TTS API 读取我的 话语 然后调用 onUtteranceCompleted 监听器 但未成功 我已经注册了我的 TTS 对象 并且它返回 SUCCESS 所以我一生都无法弄清楚为什么我的回调没有被调用 我尝
  • HikariCP 1.4.0 MBean InstanceNotFoundException

    我的数据库连接池使用以下配置 使用HikariCP 1 4 0 jdk1 6 0 45和Oracle Express 11g 在Windows 7上运行 HikariConfig config new HikariConfig config
  • HAProxy - 配置 HTTP 前端以侦听多个端口

    我的 HAProxy 配置中有一个 HAProxy HTTP 前端 如下所示 frontend myaddress net 10098 bind 80 8080 mode http log global option http server
  • 月份不是从日期打印出来的 - Java DateFormat

    如何从java中的日期获取月份 DateFormat inputDF new SimpleDateFormat mm dd yy Date date1 inputDF parse 9 30 11 Calendar cal Calendar
  • React 18严格模式导致组件渲染两次[重复]

    这个问题在这里已经有答案了 对严格模式的更改反应版本 18导致我的代码渲染两次 这会导致错误axios中止控制器 但我不知道如何清除error应用程序渲染两次后从浏览器控制台 请注意 我正在开发一个注册 登录应用程序 即使在我成功登录后 R
  • 如何在 jQuery 中调用 C# 方法?

    我正在使用一个图表 它应该从 C 获取输入来绘制图表 我使用 JSON 将值从 C 返回到 jQuery 无论如何 这对我没有帮助 我做错了什么 这是我的 aspx 代码
  • 如何使用 navigator.pop 返回 bool 值?

    我试图从对话框返回一个布尔值 但我不明白为什么该值没有根据需要返回 我尝试返回作为未来值 并在弹出对话框后将值与上下文一起返回 final bool delete await showDialog print delete Future
  • cordova - 如何将 CCAvenue 集成到 Ionic2

    我是 IONIC2 和 Angular2 的新手 在我的应用程序中 我需要带有商家服务器的 CCavenue 支付网关 请给我解决该问题的步骤 首先 您需要建立一个 CCAvenue 帐户 转到 注册 页面 选择 Startup Pro 计
  • 如何在 Docker 容器中挂载主机目录

    我正在尝试将主机目录挂载到 Docker 容器中 以便在主机上完成的任何更新都会反映到 Docker 容器中 我哪里做错了 这是我所做的 kishore cat Dockerfile FROM ubuntu trusty RUN apt g
  • 如何使用 sqlalchemy 对条目进行排名?

    我创建了一个模型用户 其中包含分数和排名列 我想定期更新 User 中所有用户的排名 使得得分最高的用户排名 1 第二高得分排名 2 等等 有没有办法在 Flask SQLAlchemy 中有效地实现这一点 Thanks 顺便说一句 这是模
  • 使用带有cookies javascript的decodeURI

    我手头的问题是我需要一个变量来跟踪我的所有 cookie 以便我可以将该变量中的字符串拆分为一个数组 然后从那里解析该字符串 我想知道为什么下面的简单代码不适合我 var count 0 keeps track of how many ti