什么是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
使用
先注册这个身份验证服务,使用什么默认方案啥的
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie();
然后再使用这个服务
app.UseAuthorization();//这个服务创建了.net core项目自带就有
CookieHelper
using Microsoft.AspNetCore.Http;using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;namespace BookApi.CookieSession{//Cookie操作类public class CookieHelper{private readonly IHttpContextAccessor _httpContextAccessor;public CookieHelper(IHttpContextAccessor httpContextAccessor){this._httpContextAccessor = httpContextAccessor;}/// <summary>/// 增加Cookie/// </summary>/// <param name="somekey">Cookie名</param>/// <param name="somevalue">Cookie值</param>public void Set(string somekey, string somevalue){//设置cookie的参数CookieOptions cookieOptions = new CookieOptions();cookieOptions.Expires = DateTimeOffset.Now.AddDays(3);//设置过期时间_httpContextAccessor.HttpContext.Response.Cookies.Append(somekey, somevalue, cookieOptions);}/// <summary>/// 获取Cookie/// </summary>/// <param name="somekey">Cookie名</param>/// <returns></returns>public string Get(string somekey){try{return _httpContextAccessor.HttpContext.Request.Cookies[somekey];}catch (Exception ex){return "";}}/// <summary>/// 删除Cookie/// </summary>/// <param name="somekey">Cookie名</param>public void Del(string somekey){_httpContextAccessor.HttpContext.Response.Cookies.Delete(somekey);}/// <summary>/// 返回用户登陆状态/// </summary>/// <param name="somekey">Cookie名</param>/// <returns></returns>public bool UserLoginState(string somekey){try{return _httpContextAccessor.HttpContext.Request.Cookies[somekey] == null ? false : true;}catch (Exception ex){return false;}}}}
