Cookie值中的+符号由空格代替

时间:2019-05-15 21:25:32

标签: ruby-on-rails ruby

我有一个带有+符号的cookie。 Cookie的值类似于+33123456789。从控制器,如果我执行cookies[:phoneNumber],它将返回33123456789(请注意3之前的空白)。

我可以用+替换空格,但是cookie内的值正确,因此我更喜欢找到一种直接恢复cookie好的值的方法。

为什么rails会删除+符号以及如何避免这种情况?

谢谢

1 个答案:

答案 0 :(得分:2)

  

我有一个带有+符号[...]的cookie,该值在cookie中是正确的

在HTTP请求/响应中,cookie值中的+具有特殊含义:它代表一个空格。

服务器通过HTTP标头设置cookie:

Set-Cookie: NAME=VALUE

客户端以类似的方式将它们发送回去:

Cookie: NAME=VALUE

根据specNAME=VALUE序列不得包含分号,逗号和空格。要添加这些字符,必须对其进行编码。编码通常为percent-encoding,它将3个排除的字符映射到:

require 'rack/utils'

Rack::Utils.escape(';') #=> "%3B"
Rack::Utils.escape(',') #=> "%2C"
Rack::Utils.escape(' ') #=> "+"

因此,如果您的控制器将文字+转换为空格,它将按预期工作:

Rack::Utils.unescape('+33123456789')
#=> " 33123456789"

要正确表示+,它必须以%2B的形式发送:

Rack::Utils.escape('+33123456789')
#=> "%2B33123456789"

解码该值将得到预期的结果:

Rack::Utils.unescape('%2B33123456789')
#=> "+33123456789"

请注意,通过ActionController#cookies访问cookie时,Rails会自动处理转义/转义。

也许您是手动设置Cookie还是在cookies帮助器之外设置Cookie。或者(不太可能)客户端未正确编码cookie。