在JavaScript中读取cookie的最短,准确和跨浏览器兼容的方法是什么?
通常,在构建独立脚本(我不能拥有任何外部依赖项)时,我发现自己添加了一个用于读取cookie的函数,并且通常会回退到QuirksMode.orgreadCookie()方法(280字节,216缩小).
function readCookie(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for(var i=0;i < ca.length;i++) {
var c = ca[i];
while (c.charAt(0)==' ') c = c.substring(1,c.length);
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
它完成了这项工作,但它的丑陋,每次都增加了相当多的膨胀.
jQuery.cookie使用这样的方法(修改,165字节,125缩小):
function read_cookie(key)
{
var result;
return (result = new RegExp('(?:^|; )' + encodeURIComponent(key) + '=([^;]*)').exec(document.cookie)) ? (result[1]) : null;
}
Run Code Online (Sandbox Code Playgroud)
请注意,这不是"Code Golf"竞赛:我有理由减少readCookie功能的大小,并确保我的解决方案有效.
首先,我不确定这是否是Opera 12.01中的问题,但问题只出现在Opera中.我在Android和iPhone上测试过FF14,Chrome 21,Safari 5(Windows)以及Safari Mac和Webkit浏览器.
我的应用程序运行trigger.io的锻造平台,使用代理从Web应用程序的服务请求路由.代理只是简单地转发请求和cookie,这在大多数浏览器中按预期工作.
在检查了dragonfly中的请求后,我注意到服务器在响应中发送了正确的头文件,但Opera似乎忽略了设置值.我想知道这是否是由于cookie的一些配置错误的路径值.我在Firefox和Opera中添加了2个请求的屏幕截图.
正如您在屏幕中看到的那样,FF会看到cookie标题并对其进行适当设置,但Opera不会.



我没有包含执行请求转发的代理中的代码,因此如果您需要,请告诉我以获得一些见解.在服务端,我正在运行PHP和Codeigniter.如果我需要在我的环境中添加更多信息,请告诉我,谢谢.
更新:即使在我的生产环境中不使用自定义TLD,也会出现此问题.其他使用cookie的网站工作正常,并启用了cookie.
设置cookie时,PHP 会对cookie值进行url编码(至少在不使用时setrawcookie),并在将cookie值提供给应用程序之前对其进行url解码$_COOKIE.
这是一个公认的标准吗?如果我设置了原始cookie值a%3Db,我会回复a=b大多数Web编程语言(通过各自的cookie读取机制)吗?
为了响应任何包含非ASCII字符的cookie的请求,ColdFusion 11似乎崩溃了.IIS 8.5返回HTTP 500内部服务器错误(空白页).
重现步骤:
在Javascript控制台中运行以下命令并尝试加载任何CFML页面:
document.cookie="a=ñ";
(可选)请求任何.html或.txt文件并接收正常响应.
请求任何ColdFusion页面并收到空白页,HTTP 500内部服务器错误.
唯一的解决方法是清除浏览器cookie.
环境:
我已经尝试添加-Dfile.encoding=UTF-8Java参数.
我没有在ColdFusion上找到其他人遇到这个问题.在Tomcat上运行Java代码存在类似的问题.但是,由于ColdFusion 11与Tomcat捆绑在一起,我甚至不知道Tomcat的运行版本以及如何升级它.(看起来ColdFusion 10运行Tomcat 7)Adobe似乎没有关于ColdFusion 11的Tomcat层的文档(特别是它与ColdFusion的关系).我已尝试将<CookieProcessor />配置应用于context.xml,如其他帖子所示.我已发布到Adobe bug基础并且未收到任何响应.
欢迎任何想法.不幸的是,我们在cookie中有很多用户使用"Español",我们无法执行任何ColdFusion代码来清除或更改它.我们在ColdFusion 9中没有遇到这个问题,并且在升级到ColdFusion 11之后在QA检查中错过了这个问题.
coldfusion-error.log完全例外:
Sep 03, 2015 11:43:58 PM org.apache.coyote.ajp.AjpProcessor process
SEVERE: Error processing request
java.lang.IllegalArgumentException: Control character in cookie value or attribute.
at org.apache.tomcat.util.http.CookieSupport.isHttpSeparator(CookieSupport.java:193)
at org.apache.tomcat.util.http.Cookies.getTokenEndPosition(Cookies.java:502)
at org.apache.tomcat.util.http.Cookies.processCookieHeader(Cookies.java:349)
at org.apache.tomcat.util.http.Cookies.processCookies(Cookies.java:168)
at org.apache.tomcat.util.http.Cookies.getCookieCount(Cookies.java:106)
at org.apache.catalina.connector.CoyoteAdapter.parseSessionCookiesId(CoyoteAdapter.java:986)
at org.apache.catalina.connector.CoyoteAdapter.postParseRequest(CoyoteAdapter.java:743)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:417)
at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:199)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at …Run Code Online (Sandbox Code Playgroud) 使用C#在cookie中存储值时,对值进行编码(或转义)的最佳方法是什么,以便可以可靠地检索和解码/转义?
我不是在谈论加密.
我正在使用Lumen(通过Laravel)微框架进行项目,我在会话方面遇到了一些麻烦.我现在只是测试实现,但我遇到的问题是,当我设置会话变量然后刷新页面时,不再设置变量.
在我的.env文件中,我有:
SESSION_DRIVER=cookie
Run Code Online (Sandbox Code Playgroud)
而且我知道这是被拾取的,因为当我将其更改为memcached时会抛出错误(因为我没有设置memcached).
我也启用了中间件:
$app->middleware([
'Illuminate\Session\Middleware\StartSession',
'Illuminate\View\Middleware\ShareErrorsFromSession',
]);
Run Code Online (Sandbox Code Playgroud)
然后在我的控制器中我有:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class SessionController extends Controller
{
public function index(Request $request)
{
$request->session()->put('email', 'test@test.com');
$request->session()->save(); // Not sure if this is required
var_dump($request->session()->get('email'));
exit;
return view('session.index', ['test' => $value]);
}
}
Run Code Online (Sandbox Code Playgroud)
加载页面时设置该值:
string(13) "test@test.com"
Run Code Online (Sandbox Code Playgroud)
但是当我注释掉设置变量的行,然后我刷新页面时,值为NULL:
// $request->session()->put('email', 'test@test.com');
// $request->session()->save();
var_dump($request->session()->get('email'));
exit;
Run Code Online (Sandbox Code Playgroud)
在浏览器中设置了一个cookie,但它似乎不是会话变量:
laravel_session 2ecef0103418ca82d068ec6a6c6fbec388af9b9e localhost / 2015-06-22T14:59:29.856Z 55 ?
Run Code Online (Sandbox Code Playgroud)
编辑:如果我将SESSION_DRIVER设置为cookie,则实际设置了cookie - 无论我是否实际设置了会话变量.
我不确定我在哪里出错,而且我发现文档并不全面.
谢谢
我在Asp.net的登录页面上有一个奇怪的问题,这个问题只发生在Safari上.
验证用户后,我从数据库中获取用户的名称(数据库中的字段为UTF8)并将其保存在cookie中.问题是,当用户的名字带有特殊字符时,我会被重定向到我来自的页面而不登录.例如"Moller"工作正常,用户登录但不是"Møller".
同样,这只发生在Safari上,当我在名字中有特殊字符时.无效的行是:Response.Cookies ["userInfo"] ["name"] = getNameFromUserid(userid);
这是我的代码:
string userid = validUserWithEmail(TextBoxEmail.Text, TextBoxPassword.Text);
if (userid != null) {
//VALID USER
Response.Cookies["userInfo"].Expires = DateTime.Now.AddDays(30);
Response.Cookies["userInfo"]["name"] = getNameFromUserid(userid);
FormsAuthentication.RedirectFromLoginPage(userid, CheckBoxPersistCookie.Checked);
}
else
{
//NOT A VALID USER SHOW A MESSAGE FOR THE USER OR SOMETHING
}
Run Code Online (Sandbox Code Playgroud) 我正在使用这段简短的代码:
var d = itemID + "," + quantity;
var CookieData = $.cookie("storebasket");
if(CookieData == null || CookieData == "") {
$.cookie("storebasket", d, { path: '/', expires: 60 });
} else {
$.cookie("storebasket", CookieData + "|" + d, { path: '/', expires: 60 });
}
Run Code Online (Sandbox Code Playgroud)
但是,值ALWAYS将变为HTML编码.例如:
5%2C1
Run Code Online (Sandbox Code Playgroud)
5,1
Run Code Online (Sandbox Code Playgroud)
我尝试过unescape但没有运气:
$.cookie("storebasket", unescape(d), { path: '/', expires: 60 });
Run Code Online (Sandbox Code Playgroud)
还有什么想法吗?
我可以写和读cookie但我不能改变现有cookie的值,它总是有第一个设定值.我发现几乎没有办法可以实现,但没有人工作.这是我的代码:
private void AddPost(string key)
{
var context = System.Web.HttpContext.Current;
var request = context.Request;
var response = context.Response;
var cookie = request.Cookies[Constants.PostsViewing];
if (cookie == null || string.IsNullOrEmpty(cookie.Value))
{
response.Cookies.Add(new HttpCookie(Constants.PostsViewing, key)
{
Expires = DateTime.Now.AddDays(365)
});
}
else
{
if (cookie.Value.Split(';').Contains(key))
{
return;
}
var v = cookie.Value + ";" + key;
cookie.Value = v;
cookie.Expires = DateTime.Now.AddDays(365);
response.Cookies.Add(cookie);
// this way also doesn't work
//cookie.Value = v;
//response.AppendCookie(cookie);
// and this
//response.Cookies[Constants.PostsViewing].Value = v;
//response.Cookies[Constants.PostsViewing].Expires = DateTime.Now.AddDays(365);
} …Run Code Online (Sandbox Code Playgroud) 我正在使用cookie在搜索页面中显示一些数据,但是当使用Unicode字符时,我的cookie会使值变得混乱.例如,当我存储时Inglês,我在Inglês读回来时会收到.
这就是我保存cookie的方式:
public void SalvaValue(string sessionKey, string sessionValue)
{
Response.Cookies.Add(new HttpCookie(sessionKey));
var httpCookie = Response.Cookies[sessionKey];
if (httpCookie != null) httpCookie.Value = sessionValue;
if (httpCookie != null) httpCookie.Expires = DateTime.Now.AddDays(14);
}
Run Code Online (Sandbox Code Playgroud)
这是我检索它的方式:
if (Request.Cookies["BuscaTipo"] != null)
{
tipoBusca = Request.Cookies["BuscaTipo"].Value.ToString();
var cookie = new HttpCookie("BuscaTipo") { Expires = DateTime.Now.AddDays(-1) };
Response.Cookies.Add(cookie);
}
Run Code Online (Sandbox Code Playgroud)
当我调试站点时,它在设置时在代码中显示正确的值,但在我使用jQuery执行请求后,该值会出现错误的字符.
如何在cookie中安全地存储Unicode字符?
cookies ×9
c# ×3
asp.net ×2
asp.net-mvc ×2
jquery ×2
php ×2
coldfusion ×1
escaping ×1
html-encode ×1
http ×1
interop ×1
javascript ×1
jwplayer ×1
laravel ×1
laravel-4 ×1
lumen ×1
opera ×1
redirect ×1
safari ×1
session ×1
tomcat ×1
trigger.io ×1