什么是Cookie

cookie就是存放在浏览器端的一个放点临时数据的东西。通常Cookie和Session配合使用。
在网页打开f12,Application选项里面,Cookies就能看到当前网页用的Cookie。

Expires

Expires是过期时间,里面写的Session就是临时cookie,浏览器关闭就没有了。写的时间就是持久cookie。
举个例子,在服务端创建Session,会返回给浏览器一个带有sessionid的cookie。如果不进行时间设置,这个cookie里面sessionid的Expires就是Session。浏览器一关sessionid就没了。哪怕服务器内存中seesion还没过期。
你sessionid都没了,是找不到session里面的数据的

Domain

同一个域下才能使用同一个cookie。同一个域,协议+主机要一样,端口可以不同。

举两个例子:

我有一个项目,前后端分离,前端vue项目,后端webapi项目。两个项目在同一台服务器,部署在不同端口。协议http,服务器ip都相同,是同一个域。 所以 我通过vue项目给webapi发请求,webapi项目创建了一个cookie返回响应。vue项目就能得到webapi创建的cookie。

还是前后端分离的项目,前端vue,后端webapi。 但是这次两个项目在两台电脑,局域网,vue在192.168.2.4:8080,webapi在192.168.2.2:5000 主机地址不一样了,在webapi项目里里面创建的cookie,vue项目根本拿不到。

要获取cookie,必须和创建cookie的在同一域里面。如下面两个例子,都可以使用cookie

192.168.2.2:5000创建 192.168.2.2:8080获取 Domain是192.168.2.2

www.abc.com/login创建 qqq.abc.com获取 Domian是.abc.com

使用

先注册这个身份验证服务,使用什么默认方案啥的

  1. services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie();

然后再使用这个服务

  1. app.UseAuthorization();//这个服务创建了.net core项目自带就有

CookieHelper

  1. using Microsoft.AspNetCore.Http;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Threading.Tasks;
  6. namespace BookApi.CookieSession
  7. {
  8. //Cookie操作类
  9. public class CookieHelper
  10. {
  11. private readonly IHttpContextAccessor _httpContextAccessor;
  12. public CookieHelper(IHttpContextAccessor httpContextAccessor)
  13. {
  14. this._httpContextAccessor = httpContextAccessor;
  15. }
  16. /// <summary>
  17. /// 增加Cookie
  18. /// </summary>
  19. /// <param name="somekey">Cookie名</param>
  20. /// <param name="somevalue">Cookie值</param>
  21. public void Set(string somekey, string somevalue)
  22. {
  23. //设置cookie的参数
  24. CookieOptions cookieOptions = new CookieOptions();
  25. cookieOptions.Expires = DateTimeOffset.Now.AddDays(3);//设置过期时间
  26. _httpContextAccessor.HttpContext.Response.Cookies.Append(somekey, somevalue, cookieOptions);
  27. }
  28. /// <summary>
  29. /// 获取Cookie
  30. /// </summary>
  31. /// <param name="somekey">Cookie名</param>
  32. /// <returns></returns>
  33. public string Get(string somekey)
  34. {
  35. try
  36. {
  37. return _httpContextAccessor.HttpContext.Request.Cookies[somekey];
  38. }
  39. catch (Exception ex)
  40. {
  41. return "";
  42. }
  43. }
  44. /// <summary>
  45. /// 删除Cookie
  46. /// </summary>
  47. /// <param name="somekey">Cookie名</param>
  48. public void Del(string somekey)
  49. {
  50. _httpContextAccessor.HttpContext.Response.Cookies.Delete(somekey);
  51. }
  52. /// <summary>
  53. /// 返回用户登陆状态
  54. /// </summary>
  55. /// <param name="somekey">Cookie名</param>
  56. /// <returns></returns>
  57. public bool UserLoginState(string somekey)
  58. {
  59. try
  60. {
  61. return _httpContextAccessor.HttpContext.Request.Cookies[somekey] == null ? false : true;
  62. }
  63. catch (Exception ex)
  64. {
  65. return false;
  66. }
  67. }
  68. }
  69. }

参考

Cookie 的 SameSite 属性