jquery.cookie.js插件一个小bug
2012-07-02 13:55
627 查看
错误描述
极个别用户用IE浏览器访问页面,在加载页面的过程中,会出现如下错误提示:错误分析
1、在页面使用jquery.cookie.js读cookie,加载页面时会查找cookie进行判断。if(\$.cookie("resultDescription")!=null) { _tips.html(\$.cookie("resultDescription")).show(); \$("#txtName").val(\$.cookie("userName")); \$.cookie("resultDescription", null); \$.cookie("userName", null); \$(".tips-username").show();//显示忘记用户名 \$(".tips-ask").show(); }
2、jquery.cookie.js内部实现方式是根据key遍历查找header中所有的cookie,并对取到的值进行decodeURIComponent解码。
// key and possibly options given, get cookie... options = value || {}; var decode = options.raw ? function(s) { return s; } : decodeURIComponent; var pairs = document.cookie.split('; '); for (var i = 0, pair; pair = pairs[i] && pairs[i].split('='); i++) { if (decode(pair[0]) === key) return decode(pair[1] || ''); // IE saves cookies with empty string as "c; ", e.g. without "=" as opposed to EOMB, thus pair[1] may be undefined }
3、用户用ie浏览器访问该页面满足以下条件就会出现以上错误提示。
1)用户浏览器中存在未知来源的cookie A(key=resultDescription,而value=被gb2312等编码过后的值)。
2)A的domain属性(domain=”.123.com“)与我们站点相同(domain=”.123.com“),即我们是可以读到这个A的。
在重现过程中发现好玩点:用户从FF浏览器访问页面,对于浏览器中存在其他域名所设定domain=”.123.com“的cookie是不会读取的,故没有任何错误,不过是xxx.123.com创建就可以访问了,故会出现错误了;
用户用IE浏览器中只要浏览器存在domain=”.123.com“,无论是谁存入的都是直接访问的,不过体现就不一样的了。
重现问题如下(以下每步操作过后都是会清理cookie的):
protected void AddCookie_Click(object sender, EventArgs e) { HttpContext.Current.Response.Cookies.Add(new HttpCookie("resultDescription", HttpUtility.UrlEncode("中国", Encoding.GetEncoding("GB2312"))) { Expires = DateTime.Now.AddDays(2),Domain = ".123.com"}); Response.Redirect("https://xxx.123.com/"); }
解决方案
jquery.cookie.js本身是通过遍历header中的cookie来查找解码后的key对应的值,再对值解码,如果是读到的cookie本身是由该插件插入到浏览器的就没有问题,而我们并不排除有由后台插入的cookie被读到,故需要修改jquery.cookie.js文件的逻辑,在编码处增加try{}catch(e){}操作。/*! * jQuery Cookie Plugin * https://github.com/carhartl/jquery-cookie * * Copyright 2011, Klaus Hartl * Dual licensed under the MIT or GPL Version 2 licenses. * http://www.opensource.org/licenses/mit-license.php * http://www.opensource.org/licenses/GPL-2.0 */ (function ($) { $.cookie = function (key, value, options) { // key and at least value given, set cookie... if (arguments.length > 1 && (!/Object/.test(Object.prototype.toString.call(value)) || value === null || value === undefined)) { options = $.extend({}, options); if (value === null || value === undefined) { options.expires = -1; } if (typeof options.expires === 'number') { var days = options.expires, t = options.expires = new Date(); t.setDate(t.getDate() + days); } value = String(value); return (document.cookie = [ encodeURIComponent(key), '=', options.raw ? value : encodeURIComponent(value), options.expires ? '; expires='+options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE options.path ? '; path=' + options.path : '', options.domain ? '; domain=' + options.domain : '', options.secure ? '; secure' : '' ].join('')); } // key and possibly options given, get cookie... options = value || {}; var decode = options.raw ? function (s) { return s; } : decodeURIComponent; var pairs = document.cookie.split('; '); for (var i = 0, pair; pair = pairs[i] && pairs[i].split('='); i++) { try { if (decode(pair[0]) === key) { var val = decode(pair[1] || ''); return val; } // IE saves cookies with empty string as "c; ", e.g. without "=" as opposed to EOMB, thus pair[1] may be undefined } catch (e) { } } return null; }; })(jQuery);
相关文章推荐
- 哈哈还有一个时间插件的小bug-----jquery-calendar.js
- 一个jQuery热键插件:js-hotkeys
- jquery的一个插件scrollable.js做的注册三步骤,只有完成第一个才能进入下一步
- jquery.fileEveryWhere.js 一个跨浏览器的file显示插件
- 原生 JS 和 Jquery 处理 cookie 的插件介绍
- jquery插件 jquery-plugin-cookie.js用法
- Jquery操作Select 简单方便 一个js插件搞定
- btFormbuilder.js 一个基于bootstrap的jquery插件,用于生成form表单
- jQuery结合jQuery.cookie.js插件实现换肤功能示例
- 分享一个使一行文字变形产生弯曲弧度特效的jQuery插件 - Arctext.js 编辑
- jquery.artwl.thickbox.js 一个非常简单好用的jQuery弹出层插件
- AudioPlayer.js,一个响应式且支持触摸操作的jquery音频插件
- 分享一个jQuery的自动客户端本地保存插件Sisyphus.js - 帮助你自动保存用户输入内容
- 【jq】插件—缓存jquery.cookie.js
- 一个简单的jQuery插件ajaxfileupload.js实现ajax上传文件例子
- jquery.SuperSlide.js只需要调用一个插件就能实现网页大部分特效--推荐
- 管理Cookie的插件——jquery.cookie.js
- JQuery cookie插件 完整源代码 jquery.cookie.js
- 几句代码写出一个内容轮播器(jQuery插件的神奇)jQuery.flexslider.js登场!!