什么是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;
}
}
}
}