Jquery Cookie插件 - 多个值?

时间:2011-06-20 20:33:34

标签: jquery cookies

我正在使用流行的jquery Cookie插件https://github.com/carhartl/jquery-cookie 想知道如何设置和读取具有多个值的cookie?或者也许可以添加/删除该cookie的值?

$ .cookie(“MyTestCookie”,email,{expires:10});

我想将用户名添加到同一个Cookie

更新:只是.Net Storing multiple values in cookies

中的一个示例

4 个答案:

答案 0 :(得分:17)

如果要设置具有多个值或“子键”的cookie并使其可从.NET中读取,则需要将子项存储为格式为查询字符串的名称 - 值对。您可以使用jQuery.param()方法将Javascript对象转换为查询字符串。

var obj = { email: 'jdoe@example.com', username: 'jdoe' };
$.cookie("MyTestCookie", $.param(obj), { expires: 10 });

然后在服务器上,您可以访问以下值:

var email = Request.Cookies["MyTestCookie"]["email"];
var username = Request.Cookies["MyTestCookie"]["username"];

编辑:我创建了一个测试页面,显示在服务器和客户端上读/写多值cookie。 http://www.systemex.net/Cookies/

注意:

  • 您需要注意转义和取消子键。这样任何嵌入式=和&正确处理
  • 在读取和编写jquery cookie时,请使用选项{raw:true},这样它就不会双重逃脱。
  • 我写了一个$ .deparam函数,它将name = value& name2 = value2字符串转换为javascript对象{name:value,name2:value2}
  • 最后一点,jquery cookie插件不会覆盖同名的cookie,它只是将它附加到当前的cookie集合中。此时,重写插件以支持子键和修改现有cookie可能会更好。

无论如何希望这有帮助。

这是Default.aspx

<h1>Get Cookie From Server:</h1>
<ul>
<li>Email: <%= GetCookie("MyTestCookie", "email")%></li>
<li>Username: <%= GetCookie("MyTestCookie", "username")%></li>
</ul>
<h1>Get Cookie From Client:</h1>
<ul>
<li>Email: <span class="cookie" data-name="MyTestCookie" data-key="email" /></li>
<li>Username: <span class="cookie" data-name="MyTestCookie" data-key="username" /></li>
<li>Raw: <span id="raw" /></li>
</ul>
<h1>Set Cookie From Client:</h1>
<ul>
<li>Email: <input type="text" name="email" value="" /></li>
<li>Username: <input type="text" name="username" value="" /></li>
</ul>
<input type="submit" value="Submit" />

<script>

    $(function () {
        $(".cookie").each(function (index) {
            var name = $(this).data('name');
            var key = $(this).data('key');
            var cookie = $.deparam($.cookie(name, { raw: true }));

            $(this).html(cookie[key]);
        });
        $('#raw').text(escape($.cookie("MyTestCookie"), { raw: true }));


        $("form").submit(function () {
            var o = {};
            o.email = $('input[name=email]').val();
            o.username = $('input[name=username]').val();
            var value = $.param(o);
            var cookie = $.cookie('MyTestCookie', value, { raw: true });
            return true;
        });
    });

    jQuery.deparam = function (params) {
        var o = {};
        if (!params) return o;
        var a = params.split('&');
        for (var i = 0; i < a.length; i++) {
            var pair = a[i].split('=');
            o[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);
        }
        return o;
    }

</script>

Default.aspx.cs

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        var cookie = new HttpCookie("MyTestCookie");
        cookie["email"] = HttpUtility.UrlEncode("jdoe@example.com");
        cookie["username"] = HttpUtility.UrlEncode("jdoe&123");
        Response.Cookies.Add(cookie);
    }
}

public string GetCookie(string name, string key)
{
    var cookie = Request.Cookies[name];
    return cookie != null ? HttpUtility.UrlDecode(cookie[key]) : "";
}

答案 1 :(得分:4)

即使不建议你仍然可以为cookie添加多个值并自己进行处理。

  

(这将减少浏览器中保留的cookie数量,但从那时起   现代浏览器旨在   处理大量的饼干吧   不会对速度做任何事情   装载)

您可以使用循环添加您的值,并使用特殊字符(例如“”)将它们分开,您可以使用您喜欢的任何加密方法处理字符串,并将所有加密方法保存为单个Cookie。< / p>

var setofcookies = username + "%" + password + "%" + email;
$.cookie("MyTestCookie", setofcookies, { expires: 10 });

稍后您可以使用 SPLIT 函数将代码转换为正确的数组值:

var cookie = $.cookie('MyTestCookie')
var mycookies = cookie.split("%");
document.write(mycookies[0]);

这是您可以用来处理Cookie的最合适的方法,其他方法会稍微降低页面速度。

答案 2 :(得分:4)

试试这个: https://github.com/tantau-horia/jquery-SuperCookie

  

快速使用:

     

创建 - 创建cookie

     

检查 - 检查存在

     

验证 - 如果JSON

,则验证cookie值      

check_index - 验证JSON中是否存在索引

     

read_values - 将cookie值读为字符串

     

read_JSON - 将cookie值读取为JSON对象

     

read_value - 读取存储在JSON对象中的索引值

     

replace_value - 替换存储在JSON对象

中的指定索引的值      

remove_value - 删除存储在JSON对象中的值和索引

只需使用:

$.super_cookie().create("name_of_the_cookie",name_field_1:"value1",name_field_2:"value2"});
$.super_cookie().read_value("name_of_the_cookie","name_field_1");

答案 3 :(得分:0)

当我使用

var obj = { a: 'test', b: 'best' };
$.cookie("MyCookie", $.param(obj), { expires: 10 });

我在cookie中获得了这个值

  

一%3Dtest%26B%3Dbest

所以得到像

这样的东西
  

A =测试和b =最好

您需要在$ .cookie()

之前添加此行
$.cookie.raw = true;