【问题标题】:Jquery Cookie plugin - multiple values?Jquery Cookie 插件 - 多个值?
【发布时间】:2018-03-16 00:45:47
【问题描述】:

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

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

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

更新:只是 .Net 中的一个示例Storing multiple values in cookies

【问题讨论】:

  • 我认为您应该为此保留单独的 cookie
  • 所以如果我要在 cookie 中存储 +10 个值,我应该设置 +10 个 cookie 来做到这一点吗?将所有值放在一个 cookie 中不是很有意义吗?
  • 如果您在 cookie 中存储 json 序列化字符串或使用单独的 cookie,则由您决定。
  • Nvm,但是如果你只是cookie中的一个json字符串,你会得到一个返回,这不起作用吗?
  • 是的,json 可能会起作用。只需额外的代码在 .NET 中对其进行序列化和反序列化

标签: jquery cookies


【解决方案1】:

如果您想设置一个包含多个值或“子键”的 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>

默认.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]) : "";
}

【讨论】:

  • 知道为什么我在尝试读取 cookie 时将空值作为值吗?这是我的 cookie 值:email%3Drrr%2540asc.om%26password%3Da8f5f167f44f4964e6c998dee827110c
  • 我尝试了两种方法:string email = Request.Cookies["SolidDomain"] ["email"];字符串密码 = Request.Cookies["SolidDomain"]["password"];字符串 email1 = Request.Cookies.Get("SolidDomain").Values.Get("email"); string password2 = Request.Cookies.Get("SolidDomain").Values.Get("password");
  • 我使用 Json 作为 cookie 值。 var 数据 = JSON.parse($.cookie('cookiename')); if (data == undefined || data == null) data = {};数据.字体 = 22; data.color = '蓝色'; $.cookie('cookiename', JSON.stringify(data), { path: '/', expires: 365 });
  • @Rbacarin 不知道你为什么不给我投票。我给出的答案是基于他正在寻找一种在 .NET 中读取多值 cookie 的方法。由于 .NET 本身支持将 cookie 作为名称-值对,这就是该解决方案所使用的。 JSON 会很好,但你只显示客户端。服务器现在需要解析 JSON 数据以检索数据。
【解决方案2】:

尽管不建议您向 cookie 添加多个值并自己进行处理。

(这将减少保存在浏览器中的 cookie 数量,但由于 现代浏览器旨在 处理大量的cookies 不会做任何事情的速度 正在加载)

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

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

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

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

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

【讨论】:

    【解决方案3】:

    试试这个: 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");
    

    【讨论】:

      【解决方案4】:

      当我使用的时候

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

      我在 cookie 中得到了这个值

      a%3Dtest%26b%3Dbest

      所以得到类似的东西

      a=测试&b=最佳

      你需要在 $.cookie() 之前添加这一行

      $.cookie.raw = true;
      

      【讨论】:

        猜你喜欢
        • 2018-12-01
        • 2014-01-25
        • 1970-01-01
        • 1970-01-01
        • 2023-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多