我有一个带有+
符号的cookie。 Cookie的值类似于+33123456789
。从控制器,如果我执行cookies[:phoneNumber]
,它将返回33123456789
(请注意3
之前的空白)。
我可以用+
替换空格,但是cookie内的值正确,因此我更喜欢找到一种直接恢复cookie好的值的方法。
为什么rails会删除+符号以及如何避免这种情况?
谢谢
答案 0 :(得分:2)
我有一个带有
+
符号[...]的cookie,该值在cookie中是正确的
在HTTP请求/响应中,cookie值中的+
具有特殊含义:它代表一个空格。
服务器通过HTTP标头设置cookie:
Set-Cookie: NAME=VALUE
客户端以类似的方式将它们发送回去:
Cookie: NAME=VALUE
根据spec,NAME=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。