MVC:Cookie和session

Cookie

同:ASP.NET Core:Cookie,除了:

  • 开箱即用(out-of-box),不需要cookie policy设置等。
  • 直接new HttpCookie()生成对象,不需要CookieBuilder
  • 在HttpCookie属性中直接设置Expire/Domain等,不需要CookieOptions
  • 直接调用Request.Cookies和Response.Cookies的Add()方法添加

    //首先有一个cookie,名字为user HttpCookie cookie = new HttpCookie("user"); //在cookie中添加若干(2个)键值对 cookie.Values.Add("id", "98"); cookie.Values.Add("pwd", "1234"); cookie.Expires = DateTime.Now.AddDays(14); Response.Cookies.Add(cookie);

演示:

生成的cookie__名为user,值为id=98&pwd=1234

陷阱

因为MVC没有区分Request.Cookies和Response.Cookies,所以相比RazorPage,MVC中的cookie更容易让开发人员犯错误。

其核心是对Request.Cookies的操作不会影响到客户端,比如:

//不会新生成一个cookie Request.Cookies.Add(cookie); //不会将名为user的Cookie值删除 Request.Cookies["user"].Values.Clear();

要(在客户端)改变cookie,需要在Response.Cookies中处理,比如:

Response.Cookies.Add(cookie);

HttpCookie cookie = Request.Cookies["user"]; cookie.Values.Clear(); Response.Cookies.Add(cookie);

cookie的删除,也需要我们自己处理:

HttpCookie cookie = Request.Cookies["user"]; cookie.Expires = DateTime.Now.AddDays(-1); //只能是设置过期时间 Response.Cookies.Add(cookie);

Session

源栈培训:ASP.NET Core:Session ,除了:

  1. 开箱即用:MVC默认支持session,不需要显式的enable
  2. Controller中自带Session属性
  3. web.config中system.web节点下配置过期时间、存储位置等,以下是默认配置:过期20分钟,存储在IIS进程

  4. 使用索引器直接取值/赋值,可以直接存放对象。

    Session["user"] = new UserModel { Name = "飞哥" };

    如果需要序列化,由开发人员自行处理:可以和RazorPage中讲述一样,使用JsonConvert;也可以使用其他方式,比如添加Serializable特性:

    [Serializable] public class UserModel

这里我们再讲一讲如何将session存储在:

服务

只需要在web.config中更改mode为:

演示:

  • 打开任务管理器查看服务:
  • IIS重启后session仍然存在

数据库

首先需要打开VS的Developer Command Prompt

MVC:Cookie和session_第1张图片

执行如下命令生成数据库:

aspnet_regsql.exe -S (localdb)MSSQLLocalDB -E -ssadd -sstype p

其中:

  • aspnet_regsql.exe:要执行的exe文件
  • -S (localdb)MSSQLLocalDB:指定要连接的SQL server实例
  • -E -ssadd:
  • -sstype p:

运行成功,就会生成如下数据库:

MVC:Cookie和session_第2张图片
最后,在web.config中配置:

注意:连接字符串中删除掉 Initial Catalog,由ASP.NET自己匹配数据库

演示:生成的session保存在上述数据库表中

你可能感兴趣的:(mvc)