網(wǎng)站首頁 編程語言 正文
一、Cookie的作用
Cookie通常用來存儲有關(guān)用戶信息的一條數(shù)據(jù),可以用來標(biāo)識登錄用戶,Cookie存儲在客戶端的瀏覽器上。在大多數(shù)瀏覽器中,每個(gè)Cookie都存儲為一個(gè)小文件。Cookie表示為鍵/值對的形式,可以利用鍵來讀取、寫入或刪除Cookie。
在ASP.NET Core中也可以使用Cookie來維護(hù)回話狀態(tài),包含回話ID的Cookie會隨著每個(gè)請求一起發(fā)送到客戶端。
二、在ASP.NET Core中使用Cookie
我們創(chuàng)建一個(gè)ASP.NET Core WebApi的項(xiàng)目,然后在WebApi中測試使用Cookie。
1、在控制器中直接使用Cookie
在項(xiàng)目中添加一個(gè)控制器,用來測試Cookie:
1.1、設(shè)置Cookie
我們在控制器里面可以使用下面的代碼設(shè)置Cookie:
HttpContext.Response.Cookies.Append("setCookie", "CookieValue");
如果想設(shè)置Cookie的過期時(shí)間,我們可以使用Append的重載方法:
CookieOptions options = new CookieOptions(); // 設(shè)置過期時(shí)間 options.Expires = DateTime.Now.AddDays(1); HttpContext.Response.Cookies.Append("setCookieExpires", "CookieValueExpires", options);
控制器里面的方法代碼如下:
using System; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; namespace CookieDemo.Controllers { [Route("api/")] [ApiController] public class CookieTestController : ControllerBase { /// <summary> /// 設(shè)置Cookie /// </summary> [HttpGet] [Route("SetCookie")] public void Get() { HttpContext.Response.Cookies.Append("setCookie", "CookieValue"); CookieOptions options = new CookieOptions(); // 設(shè)置過期時(shí)間 options.Expires = DateTime.Now.AddDays(1); HttpContext.Response.Cookies.Append("setCookieExpires", "CookieValueExpires", options); } } }
CookieOptions類可以在創(chuàng)建Cookie時(shí)指定如下的附加屬性:
- 域:用于指定與Cookie關(guān)聯(lián)的域。
- 過期時(shí)間:用于指定Cookie的過期時(shí)間。
- 路徑:用于指定Cookie路徑。
- 安全策略:用于指定Cookie是否可以通過HTTPS訪問。
- HttpOnly:用于指定Cookie是否僅對服務(wù)器可用。
運(yùn)行程序,我們首先訪問WeatherForecast控制器,并且查看Cookie信息:
我們看到,這里只有一個(gè)Cookie信息,接下來方法SetCookie方法:
我們看到,這里已經(jīng)有我們剛才添加的Cookie信息了。
1.2、獲取Cookie
我們可以根據(jù)key來獲取Cookie信息:
HttpContext.Request.Cookies["key"];
我們來看具體代碼:
using System; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; namespace CookieDemo.Controllers { [Route("api/")] [ApiController] public class CookieTestController : ControllerBase { /// <summary> /// 設(shè)置Cookie /// </summary> [HttpGet] [Route("SetCookie")] public void Get() { HttpContext.Response.Cookies.Append("setCookie", "CookieValue"); CookieOptions options = new CookieOptions(); // 設(shè)置過期時(shí)間 options.Expires = DateTime.Now.AddDays(1); HttpContext.Response.Cookies.Append("setCookieExpires", "CookieValueExpires", options); } /// <summary> /// 根據(jù)key獲取Cookie的Value值 /// </summary> /// <returns></returns> [HttpGet] [Route("GetCookie")] public string GetCookid() { return HttpContext.Request.Cookies["setCookie"]; } } }
運(yùn)行程序,查看效果:
1.3、刪除Cookie信息
我們可以根據(jù)key刪除Cookie信息,如下代碼:
HttpContext.Response.Cookies.Delete("key");
接下來看具體代碼:
using System; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; namespace CookieDemo.Controllers { [Route("api/")] [ApiController] public class CookieTestController : ControllerBase { /// <summary> /// 設(shè)置Cookie /// </summary> [HttpGet] [Route("SetCookie")] public void Get() { HttpContext.Response.Cookies.Append("setCookie", "CookieValue"); CookieOptions options = new CookieOptions(); // 設(shè)置過期時(shí)間 options.Expires = DateTime.Now.AddDays(1); HttpContext.Response.Cookies.Append("setCookieExpires", "CookieValueExpires", options); } /// <summary> /// 根據(jù)key獲取Cookie的Value值 /// </summary> /// <returns></returns> [HttpGet] [Route("GetCookie")] public string GetCookid() { return HttpContext.Request.Cookies["setCookie"]; } /// <summary> /// 根據(jù)key刪除Cookie /// </summary> [HttpGet] [Route("DeleteCookie")] public void DeleteCookie() { HttpContext.Response.Cookies.Delete("setCookie"); } } }
運(yùn)行程序,我們看查看獲取Cookie的效果:
接下來我們訪問刪除Cookie的方法:
可以看到,剛才的Cookie信息已經(jīng)刪除掉了。
2、封裝Cookie
在上面的例子中,我們是訪問的HttpContext對象的Response和Request,然后才能設(shè)置、獲取或刪除Cookie信息。在具體的程序中,我們一般是把Cookie的操作進(jìn)行封裝,我們可以使用IHttpContextAccessor接口訪問ASP.NET Core中的HttpContext.HttpContextAccessor類實(shí)現(xiàn)此接口。下面我們看一下如何在類庫中操作Cookie。
首先,我們需要注冊IHttpContextAccessor以進(jìn)行依賴項(xiàng)注入,在Startup類的ConfigureServices方法中添加類型為HttpContextAccessor的單例服務(wù):
public void ConfigureServices(IServiceCollection services) { // 注冊為單例 services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); services.AddControllers(); }
因?yàn)槲覀兪窃陬悗熘惺褂肅ookie,所以需要?jiǎng)?chuàng)建一個(gè)單獨(dú)的類庫:
接下來創(chuàng)建一個(gè)接口,里面封裝Cookie的一些操作:
namespace CookieDemo.Framework { public interface ICookieHelper { void SetCookie(string key, string value); void SetCookie(string key, string value, int expiresTime); string GetCookie(string key); void DeleteCookie(string key); } }
然后定義一個(gè)具體的實(shí)現(xiàn)類實(shí)現(xiàn)ICookieHelper接口:
using Microsoft.AspNetCore.Http; using System; namespace CookieDemo.Framework { public class CookieHelper : ICookieHelper { private readonly IHttpContextAccessor _httpContextAccessor; /// <summary> /// 通過構(gòu)造函數(shù)進(jìn)行注入 /// </summary> /// <param name="httpContextAccessor"></param> public CookieHelper(IHttpContextAccessor httpContextAccessor) { _httpContextAccessor = httpContextAccessor; } /// <summary> /// 根據(jù)key值刪除對應(yīng)的Cookie /// </summary> /// <param name="key">key值</param> public void DeleteCookie(string key) { _httpContextAccessor.HttpContext.Response.Cookies.Delete(key); } /// <summary> /// 根據(jù)key值獲取Cookie的value值 /// </summary> /// <param name="key">key值</param> /// <returns></returns> public string GetCookie(string key) { return _httpContextAccessor.HttpContext.Request.Cookies[key]; } /// <summary> /// 設(shè)置Cookie值 /// </summary> /// <param name="key">key值</param> /// <param name="value">value值</param> public void SetCookie(string key, string value) { _httpContextAccessor.HttpContext.Response.Cookies.Append(key, value); } /// <summary> /// 設(shè)置Cookie及過期時(shí)間 /// </summary> /// <param name="key">key值</param> /// <param name="value">value值</param> /// <param name="expiresTime">過期時(shí)間,以分鐘為單位</param> public void SetCookie(string key, string value, int expiresTime) { CookieOptions options = new CookieOptions() { Expires = DateTime.Now.AddMinutes(expiresTime) }; _httpContextAccessor.HttpContext.Response.Cookies.Append(key, value,options); } } }
最后我們還需要在Startup的ConfigureServices方法里面注入:
public void ConfigureServices(IServiceCollection services) { // 注冊為單例 services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); // 注冊Cookie操作接口 services.AddSingleton<ICookieHelper, CookieHelper>(); services.AddControllers(); }
在添加一個(gè)控制器訪問Cookie:
using CookieDemo.Framework; using Microsoft.AspNetCore.Mvc; namespace CookieDemo.Controllers { [Route("api/CookieHelperTest")] [ApiController] public class CookieHelperTestController : ControllerBase { private readonly ICookieHelper _helper; public CookieHelperTestController(ICookieHelper helper) { _helper = helper; } /// <summary> /// 設(shè)置Cookie /// </summary> [HttpGet] [Route("SetCookie")] public void Get() { _helper.SetCookie("cookieHelperKey", "cookieHelperValue"); // 設(shè)置過期時(shí)間 _helper.SetCookie("cookieHelperExpiresKey", "cookieHelperExpitesValue",10); } /// <summary> /// 根據(jù)key獲取Cookie的Value值 /// </summary> /// <returns></returns> [HttpGet] [Route("GetCookie")] public string GetCookid() { return _helper.GetCookie("cookieHelperKey"); } /// <summary> /// 根據(jù)key刪除Cookie /// </summary> [HttpGet] [Route("DeleteCookie")] public void DeleteCookie() { _helper.DeleteCookie("cookieHelperKey"); } } }
運(yùn)行程序,首先訪問設(shè)置Cookie的方法:
可以看到,已經(jīng)我們設(shè)置的Cookie信息了。
接下來訪問獲取Cookie:
可以根據(jù)key獲取到對應(yīng)的value值。
最后訪問刪除Cookie:
可以看到,key對應(yīng)的cookie已經(jīng)被刪除了。
GitHub源碼地址:https://github.com/jxl1024/Cookie
原文鏈接:https://www.cnblogs.com/dotnet261010/p/13227777.html
相關(guān)推薦
- 2022-05-25 Python可變參數(shù)*args和**kwargs_python
- 2022-02-28 react高階函數(shù)和函數(shù)柯里化 學(xué)習(xí)
- 2023-01-08 Android消息機(jī)制原理深入分析_Android
- 2023-02-10 Docker不同網(wǎng)段下的容器互聯(lián)的實(shí)現(xiàn)_docker
- 2022-08-21 python格式的Caffe圖片數(shù)據(jù)均值計(jì)算學(xué)習(xí)_python
- 2022-04-02 教你在windows下搭建MQTT服務(wù)器的方法_win服務(wù)器
- 2022-11-08 PostgreSQL?pg_filenode.map文件介紹_PostgreSQL
- 2023-07-31 解決el-tree數(shù)據(jù)回顯時(shí)子節(jié)點(diǎn)部分選中,父節(jié)點(diǎn)都全選中的坑
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支