检查cookie是否存在的好方法是什么?
条件:
Cookie存在,如果
cookie1=;cookie1=345534;
//or
cookie1=345534;cookie1=;
//or
cookie1=345534;
如果
,则Cookie不存在cookie=;
//or
<blank>
答案 0 :(得分:99)
您可以使用所需的cookie名称调用函数getCookie,然后检查它是否为null。
function getCookie(name) {
var dc = document.cookie;
var prefix = name + "=";
var begin = dc.indexOf("; " + prefix);
if (begin == -1) {
begin = dc.indexOf(prefix);
if (begin != 0) return null;
}
else
{
begin += 2;
var end = document.cookie.indexOf(";", begin);
if (end == -1) {
end = dc.length;
}
}
// because unescape has been deprecated, replaced with decodeURI
//return unescape(dc.substring(begin + prefix.length, end));
return decodeURI(dc.substring(begin + prefix.length, end));
}
function doSomething() {
var myCookie = getCookie("MyCookie");
if (myCookie == null) {
// do cookie doesn't exist stuff;
}
else {
// do cookie exists stuff
}
}
答案 1 :(得分:64)
我制作了一个替代的非jQuery版本:
document.cookie.match(/^(.*;)?\s*MyCookie\s*=\s*[^;]+(.*)?$/)
它只测试cookie的存在。更复杂的版本也可以返回cookie值:
value_or_null = (document.cookie.match(/^(?:.*;)?\s*MyCookie\s*=\s*([^;]+)(?:.*)?$/)||[,null])[1]
将您的Cookie名称替换为MyCookie
。
答案 2 :(得分:20)
document.cookie.indexOf('cookie_name=');
如果该cookie不存在,它将返回-1
。
P.S。唯一的缺点是(如评论中所述),如果存在具有此类名称的cookie,则会出错:any_prefix_cookie_name
(Source)
答案 3 :(得分:8)
注意! 所选答案包含一个错误(Jac的回答)。
如果您有多个cookie(非常可能......)并且您正在检索的cookie是列表中的第一个,它不会将变量设置为“end”,因此它将返回以下整个字符串document.cookie string中的“cookieName =”!
这是该功能的修订版本:
function getCookie( name ) {
var dc,
prefix,
begin,
end;
dc = document.cookie;
prefix = name + "=";
begin = dc.indexOf("; " + prefix);
end = dc.length; // default to end of the string
// found, and not in first position
if (begin !== -1) {
// exclude the "; "
begin += 2;
} else {
//see if cookie is in first position
begin = dc.indexOf(prefix);
// not found at all or found as a portion of another cookie name
if (begin === -1 || begin !== 0 ) return null;
}
// if we find a ";" somewhere after the prefix position then "end" is that position,
// otherwise it defaults to the end of the string
if (dc.indexOf(";", begin) !== -1) {
end = dc.indexOf(";", begin);
}
return decodeURI(dc.substring(begin + prefix.length, end) ).replace(/\"/g, '');
}
答案 4 :(得分:6)
如果您使用的是jQuery,则可以使用jquery.cookie plugin。
获取特定cookie的值如下:
$.cookie('MyCookie'); // Returns the cookie value
答案 5 :(得分:3)
regexObject。test(String)是faster而不是字符串。match(RegExp)。
MDN site描述了document.cookie的格式,并有一个示例正则表达式来获取cookie(document.cookie.replace(/(?:(?:^|.*;\s*)test2\s*\=\s*([^;]*).*$)|^.*$/, "$1");
)。基于此,我会这样做:
/^(.*;)?\s*cookie1\s*=/.test(document.cookie);
问题似乎是要求一个解决方案,在设置cookie时返回false,但是为空。在那种情况下:
/^(.*;)?\s*cookie1\s*=\s*[^;]/.test(document.cookie);
<强>测试强>
function cookieExists(input) {return /^(.*;)?\s*cookie1\s*=/.test(input);}
function cookieExistsAndNotBlank(input) {return /^(.*;)?\s*cookie1\s*=\s*[^;]/.test(input);}
var testCases = ['cookie1=;cookie1=345534;', 'cookie1=345534;cookie1=;', 'cookie1=345534;', ' cookie1 = 345534; ', 'cookie1=;', 'cookie123=345534;', 'cookie=345534;', ''];
console.table(testCases.map(function(s){return {'Test String': s, 'cookieExists': cookieExists(s), 'cookieExistsAndNotBlank': cookieExistsAndNotBlank(s)}}));
答案 6 :(得分:1)
function getCookie(name) {
var dc = document.cookie;
var prefix = name + "=";
var begin = dc.indexOf("; " + prefix);
if (begin == -1) {
begin = dc.indexOf(prefix);
if (begin != 0) return null;
else{
var oneCookie = dc.indexOf(';', begin);
if(oneCookie == -1){
var end = dc.length;
}else{
var end = oneCookie;
}
return dc.substring(begin, end).replace(prefix,'');
}
}
else
{
begin += 2;
var end = document.cookie.indexOf(";", begin);
if (end == -1) {
end = dc.length;
}
var fixed = dc.substring(begin, end).replace(prefix,'');
}
// return decodeURI(dc.substring(begin + prefix.length, end));
return fixed;
}
尝试了@jac功能,遇到了一些麻烦,这是我编辑他的功能的方法。
答案 7 :(得分:1)
请注意,如果 cookie 是安全的,则您无法使用 document.cookie
(所有答案都在使用)检查客户端是否存在。此类cookie只能在服务器端检查。
答案 8 :(得分:1)
这是一个古老的问题,但这是我使用的方法...
X-Forwarded-Proto
当cookie不存在或不包含所请求的名称时,它将返回X-Forarded-For
。
否则,将返回(所请求名称的)值。
没有值的cookie永远不应该存在-因为公平地说,这有什么意义?
如果不再需要,最好将它们全部消除。
function getCookie(name) {
var match = document.cookie.match(RegExp('(?:^|;\\s*)' + name + '=([^;]*)')); return match ? match[1] : null;
}
答案 9 :(得分:1)
使用JavaScript:
branchArray := strings.Split(branchString, "/")
branchArray = []string{branchArray[0], strings.Join(branchArray[1:], "/")}
remote = branchArray[0]
branchname = branchArray[1]
答案 10 :(得分:0)
改为使用此方法:
function getCookie(name) {
var value = "; " + document.cookie;
var parts = value.split("; " + name + "=");
if (parts.length == 2) return parts.pop().split(";").shift();
else return null;
}
function doSomething() {
var myCookie = getCookie("MyCookie");
if (myCookie == null) {
// do cookie doesn't exist stuff;
}
else {
// do cookie exists stuff
}
}
答案 11 :(得分:0)
function hasCookie(cookieName){
return document.cookie.split(';')
.map(entry => entry.split('='))
.some(([name, value]) => (name.trim() === cookieName) && !!value);
}
注意:作者希望该函数在cookie为空的情况下返回false,即cookie=;
是通过&& !!value
条件实现的。如果您认为空Cookie仍然是现有Cookie,请将其删除...
答案 12 :(得分:0)
这里有几个很好的答案。但是,我更喜欢 [1] 不使用正则表达式,而 [2] 使用易于理解的逻辑,以及 [3] 具有简短功能,如果名称是另一个Cookie名称的子字符串,则 [4] 不会不返回true。最后, [5] 我们不能为每个循环使用a,因为返回不会破坏它。
new_query1
答案 13 :(得分:0)
function getcookie(name = '') {
let cookies = document.cookie;
let cookiestore = {};
cookies = cookies.split(";");
if (cookies[0] == "" && cookies[0][0] == undefined) {
return undefined;
}
cookies.forEach(function(cookie) {
cookie = cookie.split(/=(.+)/);
if (cookie[0].substr(0, 1) == ' ') {
cookie[0] = cookie[0].substr(1);
}
cookiestore[cookie[0]] = cookie[1];
});
return (name !== '' ? cookiestore[name] : cookiestore);
}
要获取Cookie对象,只需调用getCookie()
要检查cookie是否存在,请执行以下操作:
if (!getcookie('myCookie')) {
console.log('myCookie does not exist.');
} else {
console.log('myCookie value is ' + getcookie('myCookie'));
}
或者只使用三元运算符。
答案 14 :(得分:0)
/// ************************************************ cookie_exists
/// global entry point, export to global namespace
/// <synopsis>
/// cookie_exists ( name );
///
/// <summary>
/// determines if a cookie with name exists
///
/// <param name="name">
/// string containing the name of the cookie to test for
// existence
///
/// <returns>
/// true, if the cookie exists; otherwise, false
///
/// <example>
/// if ( cookie_exists ( name ) );
/// {
/// // do something with the existing cookie
/// }
/// else
/// {
/// // cookies does not exist, do something else
/// }
function cookie_exists ( name )
{
var exists = false;
if ( document.cookie )
{
if ( document.cookie.length > 0 )
{
// trim name
if ( ( name = name.replace ( /^\s*/, "" ).length > 0 ) )
{
var cookies = document.cookie.split ( ";" );
var name_with_equal = name + "=";
for ( var i = 0; ( i < cookies.length ); i++ )
{
// trim cookie
var cookie = cookies [ i ].replace ( /^\s*/, "" );
if ( cookie.indexOf ( name_with_equal ) === 0 )
{
exists = true;
break;
}
}
}
}
}
return ( exists );
} // cookie_exists
答案 15 :(得分:0)
对于使用Node的任何人,我发现了一个使用ES6导入和cookie
模块的简单明了的解决方案!
首先安装cookie模块(并保存为依赖项):
npm install --save cookie
然后导入并使用:
import cookie from 'cookie';
let parsed = cookie.parse(document.cookie);
if('cookie1' in parsed)
console.log(parsed.cookie1);
答案 16 :(得分:0)
而不是cookie变量,您只需使用document.cookie.split ...
var cookie = 'cookie1=s; cookie1=; cookie2=test';
var cookies = cookie.split('; ');
cookies.forEach(function(c){
if(c.match(/cookie1=.+/))
console.log(true);
});
答案 17 :(得分:-1)
var cookie = 'cookie1=s; cookie1=; cookie2=test';
var cookies = cookie.split('; ');
cookies.forEach(function(c){
if(c.match(/cookie1=.+/))
console.log(true);
});
答案 18 :(得分:-1)
您可以验证 cookie 是否存在以及它是否具有定义的值:
function getCookie(cookiename) {
if (typeof(cookiename) == "string" && cookiename != "") {
const cookies = document.cookie.split(";");
for (i = 0; i < cookies.length; i++) {
if (cookies[i].trim().startsWith(cookiename)) {
return cookies[i].split("=")[1];
}
}
}
return null;
}
如果cookie不存在则返回null。
答案 19 :(得分:-2)
如果您只是检查是否存在cookie,为什么不...
if(isset($ _ COOKIE ['mycookie'])){在这里做东西}