Как сохранить объект в файле cookie?
Пока это возможно в С#: (Пользователь в этом случае является классом L2S)
User user = // function to get user
Session["User"] = user;
почему это невозможно?
User user = // function to get user
HttpCookie cookie = new HttpCookie();
cookie.Value = user;
и как это можно сделать? Я не хочу хранить идентификатор пользователя в файле cookie, а затем выполнять некоторую проверку.
Btw, если это возможно, безопасно хранить объект в cookie, а не только идентификатор?
Ответы
Ответ 1
Файл cookie - это только строковые данные; единственный способ сделать это - сериализовать его как строку (xml, json, base-64 произвольного двоичного кода), однако вы не должны доверять чему-либо в файле cookie, если это относится к информации о безопасности ( "кто я?" ) в качестве: для конечного пользователя легко изменить его, и b: вы не хотите накладных расходов чего-либо большего на каждый запрос.
IMO, кэширование этого, поскольку сервер - правильная вещь; не помещайте это в файл cookie.
Ответ 2
Вы можете использовать JSON
string myObjectJson = new JavaScriptSerializer().Serialize(myObject);
var cookie = new HttpCookie("myObjectKey", myObjectJson)
{
Expires = DateTime.Now.AddYears(1)
};
HttpContext.Response.Cookies.Add(cookie);
Ответ 3
Короткий ответ: Cookies хранят строки, а не двоичные объекты.
Вы можете сериализовать свой объект в строки или JSON, если хотите. Предложите держать данные взад-вперед как можно более легкими. Помните: каждый раз, когда мы общаемся с браузером на сервер, вы каждый раз передаете все эти данные.
Ответ 4
вы также можете зашифровать такой файл cookie. Тогда содержимое (json/xml/etc) было бы более безопасным. Кэширование на стороне сервера, как предполагает Марк, вероятно, лучше.
Компромисс: увеличенный трафик на проводе (файлы cookie передаются взад и вперед). При увеличении объема памяти на стороне сервера и/или вторичном хранении.
btw: не забывайте, что двоичный код может быть закодирован в текст, если вам это действительно нужно.
http://www.codeproject.com/KB/security/TextCoDec.aspx
Ответ 5
Попробуйте что-то вроде этого?
StringWriter outStream = new StringWriter();
XmlSerializer s = new XmlSerializer(typeof(List<List<string>>));
s.Serialize(outStream, myObj);
cookie.Value = outStream.ToString();
Ответ 6
В файле cookie вы можете сохранить значение строки типа. вы можете сохранить свой объект в сеансе, в представлении или в кеше. но все же хотите хранить файлы cookie, просто используйте класс system.web.script.javascriptserialization и преобразуйте весь объект в строку json, а затем сохраните его в своем cookie.
Ответ 7
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);
Ответ 8
вы можете попробовать следующее:
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);
}
}
Ответ 9
для хранения объекта в cookie мы должны преобразовать его в строковое представление (сжатое или нет), которое ограничено 4kb. этот пример демонстрирует, как сохранить маленький объект "Купить" в куки (save/extend/ reset/clear). вместо отдельных строк кода я использовал 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";
}
Ответ 10
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;
}
}