Как сохранить объект в куки? - PullRequest
14 голосов
/ 08 июля 2011

Хотя это возможно в C #: (в данном случае пользователь является классом L2S)

User user = // function to get user
Session["User"] = user;

почему это невозможно?

User user = // function to get user
HttpCookie cookie = new HttpCookie();
cookie.Value = user; 

и как это можно сделать?Я не хочу хранить идентификатор пользователя в файле cookie, а затем выполнить некоторую проверку.

Кстати, если это возможно, безопасно ли хранить объект в cookie, а не только в идентификаторе?

Ответы [ 10 ]

12 голосов
/ 08 июля 2011

Cookie - это просто строковые данные;единственный способ сделать это состоит в том, чтобы сериализовать его как строку (xml, json, base-64 произвольного двоичного файла и т. д.), однако вы не должны действительно доверять чему-либо в куки, если это связанок информации о безопасности («кто я?») как: конечному пользователю легко ее изменить, и b: вы не хотите, чтобы при каждом отдельном запросе возникали какие-либо большие затраты.

IMO, кэширование этого как сервера - правильная вещь;не кладите это в печенье.

11 голосов
/ 13 декабря 2013

Вы можете использовать JSON

string myObjectJson = new JavaScriptSerializer().Serialize(myObject);
var cookie = new HttpCookie("myObjectKey", myObjectJson) 
{     
    Expires = DateTime.Now.AddYears(1) 
};
HttpContext.Response.Cookies.Add(cookie);
4 голосов
/ 08 июля 2011

Краткий ответ: Cookies хранят строки, а не двоичные объекты.

Вы можете сериализовать ваш объект в строки или JSON, если вы действительно этого хотите.Предложите хранить данные как можно проще.Помните: каждый раз, когда мы общаемся из браузера с сервером, вы каждый раз передаете все эти данные.

1 голос
/ 08 июля 2011

Вы также можете зашифровать такой файл cookie.Содержимое (json / xml / etc) будет немного безопаснее.Кэширование на стороне сервера, как предполагает Марк, возможно, лучше.

Компромисс: увеличенный трафик в сети (файлы cookie передаются туда-сюда) по сравнению с большим объемом памяти и / или вторичным хранилищем на стороне сервера.

Кстати: не забывайте, что двоичный файл может бытьзакодирован в текст, если вам это действительно нужно.

http://www.codeproject.com/KB/security/TextCoDec.aspx

0 голосов
/ 09 января 2017

Cookie хранит только строки.Что вы можете сделать:

 var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
 var json = serializer.Serialize(user);
controller.Response.SetCookie(
        new HttpCookie({string_name}, json)
        {
            Expires = false // use this when you want to delete
                    ? DateTime.Now.AddMonths(-1)
                    : DateTime.Now.Add({expiration})
        });

Это должно вставить весь объект в cookie.

Чтобы прочитать из cookie обратно в объект:

    public static {Object_Name} GetUser(this Controller controller)
    {

        var httpRequest = controller.Request;

        if (httpRequest.Cookies[{cookie_name}] == null)
        {
            return null;
        }
        else
        {
            var json = httpRequest.Cookies[{cookie_name}].Value;
            var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
            var result = serializer.Deserialize<{object_name}>(json);
            return result;
        }

    }
0 голосов
/ 03 ноября 2016

чтобы сохранить объект в cookie, мы должны преобразовать его в строковое представление (сжатое или нет), которое ограничено 4 КБ В этом примере показано, как сохранить небольшой объект «Купить» в файлах cookie (сохранить / продлить / сбросить / очистить). вместо отдельных строк кода я использовал Json, чтобы заполнить этот объект некоторыми данными.

using System;
using System.Collections.Generic;
using System.Web;
using Newtonsoft.Json;
public class Customer
{
    public int id;
    public string name;
}
public class Order
{
    public int id;
    public decimal total;
    public Customer customer;
}
public class OrderItem
{
    public int id;
    public string name;
    public decimal price;
}
public class Buy
{
    public Order order;
    public List<OrderItem> cart;
}
static readonly string cookieName = @"buy";
protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);
    if (!IsPostBack)
        Restore_Click(null, null);
}
protected void Save_Click(object sender, EventArgs e)
{
    string buy = JsonConvert.SerializeObject(new
    {
        order = new
        {
            id = 1,
            total = 20.10,
            customer = new
            {
                id = 1,
                name = "Stackoverflow"
            }
        },
        cart = new[] {
            new {
                id = 1 , 
                name = "Stack",
                price = 10.05 
            },
            new {
                id = 2 , 
                name = "Overflow",
                price = 10.05 
            }
        }
    });
    HttpContext.Current.Response.Cookies.Add(
        new HttpCookie(cookieName, buy) {
            Expires = DateTime.Now.AddDays(7)
        }
    );
    StatusLabel.Text = "Saved";
}
protected void Prolong_Click(object sender, EventArgs e)
{
    HttpCookie cookie = HttpContext.Current.Request.Cookies[cookieName];
    if (cookie != null)
    {
        cookie.Expires = DateTime.Now.AddDays(7);
        HttpContext.Current.Response.Cookies.Add(cookie);
        StatusLabel.Text = "Prolonged";
    }
    else StatusLabel.Text = "Not prolonged - expired";
}
protected void Restore_Click(object sender, EventArgs e)
{
    Buy buy = null;
    HttpCookie cookie = HttpContext.Current.Request.Cookies[cookieName];
    if (cookie != null)
    {
        buy = JsonConvert.DeserializeObject<Buy>(cookie.Value);
        StatusLabel.Text = "Restored";
    }
    else StatusLabel.Text = "Not restored - expired";
}
protected void ClearOut_Click(object sender, EventArgs e)
{
    HttpCookie cookie = HttpContext.Current.Request.Cookies[cookieName];
    if (cookie != null)
    {
        cookie.Expires = DateTime.Now.AddMonths(-1);
        HttpContext.Current.Response.Cookies.Add(cookie);
        StatusLabel.Text = "Cleared out";
    }
    else StatusLabel.Text = "Not found - expired";
}
0 голосов
/ 08 июля 2014

Вы можете попробовать это:

public void AddToCookie(SessionUser sessionUser)
    {
        var httpCookie = HttpContext.Current.Response.Cookies["SessionUser"];
        if (httpCookie != null)
        {
            httpCookie["ID"] = sessionUser.ID.ToString();
            httpCookie["Name"] = sessionUser.Name;
            httpCookie["Email"] = sessionUser.Email;
            httpCookie["Phone"] = sessionUser.Phone;
            httpCookie.Expires = DateTime.Now.AddDays(1);
        }

    }
0 голосов
/ 02 марта 2014
System.Collections.Specialized.NameValueCollection cookiecoll = new System.Collections.Specialized.NameValueCollection();

            cookiecoll.Add(bizID.ToString(), rate.ToString());


        HttpCookie cookielist = new HttpCookie("MyListOfCookies");
        cookielist.Values.Add(cookiecoll);
        HttpContext.Current.Response.Cookies.Add(cookielist);
0 голосов
/ 09 октября 2013

в cookie вы можете хранить значение типа string. Вы можете сохранить свой объект в сессии, viewstate или в кеше. но все же хотите сохранить в cookie, просто используйте класс system.web.script.javascriptserialization и преобразуйте весь объект в строку json, а затем сохраните его в своем cookie.

0 голосов
/ 08 июля 2011

Попробуйте что-нибудь подобное?

StringWriter outStream = new StringWriter();
XmlSerializer s = new XmlSerializer(typeof(List<List<string>>));
s.Serialize(outStream, myObj);
cookie.Value = outStream.ToString();
...