javascript - Javascript 执行顺序:cookie 是否总是在重定向之前设置?
问题描述
当用户单击一个按钮时,我会创建 4 个 cookie,然后将他发送到下一页:
$('button').on('click', function() {
create_cookie('cookie1', 'value1', 30);
create_cookie('cookie2', 'value2', 30);
create_cookie('cookie3', 'value3', 30);
create_cookie('cookie4', 'value4', 30);
window.location = 'nextpage/';
});
使用 create_cookie:
function create_cookie(name, value, lifetime) {
var date = new Date();
date.setTime(date.getTime() + (lifetime * 24 * 60 * 60 * 1000));
var expires = "; expires=" + date.toGMTString();
document.cookie = name + "=" + value + expires + "; path=/";
}
我的问题:我确定使用这种方法,cookie 是在重定向之前设置的吗?或者在极少数情况下,cookie 没有按时设置,并且重定向已经开始,导致页面加载没有正确的 cookie?当然,鉴于用户的浏览器设置为接受 cookie。
我自己从来没有遇到过任何问题,但在我的错误日志中,我看到有时(尽管很少见),某些用户没有在下一页上设置 cookie。这当然可能是因为用户直接访问重定向页面,如果 cookie 设置不正确,我可以重定向它们,但我想确保上述方法是可靠的,以避免用户单击按钮并立即被重定向到错误页面,因为 cookie 设置不正确。
提前非常感谢!
解决方案
但我想确保上述方法是可靠的,以避免用户单击按钮并立即重定向到错误页面,因为 cookie 设置不正确。
如果 cookie 不存在,您可以阻止重定向。创建一个提取 cookie 并检查它们是否存在的函数。
从这个答案中获取函数:
function get_cookie(cookiename)
{
var cookiestring=RegExp(""+cookiename+"[^;]+").exec(document.cookie);
return decodeURIComponent(!!cookiestring ? cookiestring.toString().replace(/^[^=]+./,"") : "");
}
然后设置一个if语句
$('button').on('click', function() {
create_cookie('cookie1', 'value1', 30);
create_cookie('cookie2', 'value2', 30);
create_cookie('cookie3', 'value3', 30);
create_cookie('cookie4', 'value4', 30);
if(get_cookie('cookie1') &&
get_cookie('cookie2') &&
get_cookie('cookie3') &&
get_cookie('cookie4')
) { window.location.href = 'nextpage' }
});
您可以编写一个函数来定期检查 cookie,然后如果所有都存在则重定向,但由于 @JaromandaX 特别提到将在后续行运行之前设置 cookie,我认为这没有必要。但是,如果您可以复制以下问题,您可以尝试:
我看到有时(尽管很少见),某些用户没有在下一页设置 cookie。
您可以使用递归超时来执行此操作:
function check_cookies(cookienames, callback){
setTimeout(function(){
var ok = cookienames.every(function(c){
return get_cookie(c);
});
if(ok) callback();
else check_cookies(cookienames, callback);
}, 1000);
}
$('button').on('click', function() {
create_cookie('cookie1', 'value1', 30);
create_cookie('cookie2', 'value2', 30);
create_cookie('cookie3', 'value3', 30);
create_cookie('cookie4', 'value4', 30);
var cookie_arr = ['cookie1', 'cookie2', 'cookie3', 'cookie4'];
check_cookies(cookie_arr, function(){ window.location.href = 'nextpage' })
});
推荐阅读
- mongodb - MongoDB _id 索引不能线性扩展
- google-app-engine - 运行 gcloud datastore cleanup-indexes 时出现内部服务器错误 gcloud.datastore.cleanup-indexes
- vba - 如何使用 VBA 将日期重新格式化为 YYYYMMDD?
- python - 如何在 Tkinter 中制作可以调整大小的框架
- bash - 如何删除文件中除第一个匹配行之外的重复行
- swift - 在 Swift 4 中传递 JSON
- python - 使用图像作为海龟形状
- ios - iOS 自定义 URL 方案以使用捆绑标识符打开我的其他应用程序
- javascript - 使用下拉选择的值更新单元格
- click - 上下文菜单项