首頁 > 軟體

ASP.NET Core在WebApi專案中使用Cookie

2022-03-26 19:00:52

一、Cookie的作用

Cookie通常用來儲存有關使用者資訊的一條資料,可以用來標識登入使用者,Cookie儲存在使用者端的瀏覽器上。在大多數瀏覽器中,每個Cookie都儲存為一個小檔案。Cookie表示為鍵/值對的形式,可以利用鍵來讀取、寫入或刪除Cookie。

在ASP.NET Core中也可以使用Cookie來維護回話狀態,包含回話ID的Cookie會隨著每個請求一起傳送到使用者端。

二、在ASP.NET Core中使用Cookie

我們建立一個ASP.NET Core WebApi的專案,然後在WebApi中測試使用Cookie。

1、在控制器中直接使用Cookie

在專案中新增一個控制器,用來測試Cookie:

1.1、設定Cookie

我們在控制器裡面可以使用下面的程式碼設定Cookie:

HttpContext.Response.Cookies.Append("setCookie", "CookieValue");

如果想設定Cookie的過期時間,我們可以使用Append的過載方法:

CookieOptions options = new CookieOptions();
// 設定過期時間
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>
        /// 設定Cookie
        /// </summary>
        [HttpGet]
        [Route("SetCookie")]
        public void Get()
        {
            HttpContext.Response.Cookies.Append("setCookie", "CookieValue");
         
            CookieOptions options = new CookieOptions();
            // 設定過期時間
            options.Expires = DateTime.Now.AddDays(1);
            HttpContext.Response.Cookies.Append("setCookieExpires", "CookieValueExpires", options);
        }
    }
}

CookieOptions類可以在建立Cookie時指定如下的附加屬性:

  • 域:用於指定與Cookie關聯的域。
  • 過期時間:用於指定Cookie的過期時間。
  • 路徑:用於指定Cookie路徑。
  • 安全策略:用於指定Cookie是否可以通過HTTPS存取。
  • HttpOnly:用於指定Cookie是否僅對伺服器可用。

執行程式,我們首先存取WeatherForecast控制器,並且檢視Cookie資訊:

我們看到,這裡只有一個Cookie資訊,接下來方法SetCookie方法:

我們看到,這裡已經有我們剛才新增的Cookie資訊了。

1.2、獲取Cookie

我們可以根據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>
        /// 設定Cookie
        /// </summary>
        [HttpGet]
        [Route("SetCookie")]
        public void Get()
        {
            HttpContext.Response.Cookies.Append("setCookie", "CookieValue");
         
            CookieOptions options = new CookieOptions();
            // 設定過期時間
            options.Expires = DateTime.Now.AddDays(1);
            HttpContext.Response.Cookies.Append("setCookieExpires", "CookieValueExpires", options);
        }

        /// <summary>
        /// 根據key獲取Cookie的Value值
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        [Route("GetCookie")]
        public string GetCookid()
        {           
            return HttpContext.Request.Cookies["setCookie"];
        }
    }
}

執行程式,檢視效果:

1.3、刪除Cookie資訊

我們可以根據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>
        /// 設定Cookie
        /// </summary>
        [HttpGet]
        [Route("SetCookie")]
        public void Get()
        {
            HttpContext.Response.Cookies.Append("setCookie", "CookieValue");
         
            CookieOptions options = new CookieOptions();
            // 設定過期時間
            options.Expires = DateTime.Now.AddDays(1);
            HttpContext.Response.Cookies.Append("setCookieExpires", "CookieValueExpires", options);
        }

        /// <summary>
        /// 根據key獲取Cookie的Value值
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        [Route("GetCookie")]
        public string GetCookid()
        {           
            return HttpContext.Request.Cookies["setCookie"];
        }

        /// <summary>
        /// 根據key刪除Cookie
        /// </summary>
        [HttpGet]
        [Route("DeleteCookie")]
        public void DeleteCookie()
        {
            HttpContext.Response.Cookies.Delete("setCookie");
        }
    }
}

執行程式,我們看檢視獲取Cookie的效果:

接下來我們存取刪除Cookie的方法:

可以看到,剛才的Cookie資訊已經刪除掉了。

2、封裝Cookie

在上面的例子中,我們是存取的HttpContext物件的Response和Request,然後才能設定、獲取或刪除Cookie資訊。在具體的程式中,我們一般是把Cookie的操作進行封裝,我們可以使用IHttpContextAccessor介面存取ASP.NET Core中的HttpContext.HttpContextAccessor類實現此介面。下面我們看一下如何在類庫中操作Cookie。

首先,我們需要註冊IHttpContextAccessor以進行依賴項注入,在Startup類的ConfigureServices方法中新增型別為HttpContextAccessor的單例服務:

public void ConfigureServices(IServiceCollection services)
{
    // 註冊為單例
    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
    services.AddControllers();
}

因為我們是在類庫中使用Cookie,所以需要建立一個單獨的類庫:

接下來建立一個介面,裡面封裝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);
    }
}

然後定義一個具體的實現類實現ICookieHelper介面:

using Microsoft.AspNetCore.Http;
using System;

namespace CookieDemo.Framework
{
    public class CookieHelper : ICookieHelper
    {
        private readonly IHttpContextAccessor _httpContextAccessor;

        /// <summary>
        /// 通過建構函式進行注入
        /// </summary>
        /// <param name="httpContextAccessor"></param>
        public CookieHelper(IHttpContextAccessor httpContextAccessor)
        {
            _httpContextAccessor = httpContextAccessor;
        }

        /// <summary>
        /// 根據key值刪除對應的Cookie
        /// </summary>
        /// <param name="key">key值</param>
        public void DeleteCookie(string key)
        {
            _httpContextAccessor.HttpContext.Response.Cookies.Delete(key);
        }

        /// <summary>
        /// 根據key值獲取Cookie的value值
        /// </summary>
        /// <param name="key">key值</param>
        /// <returns></returns>
        public string GetCookie(string key)
        {
           return _httpContextAccessor.HttpContext.Request.Cookies[key];
        }

        /// <summary>
        /// 設定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>
        /// 設定Cookie及過期時間
        /// </summary>
        /// <param name="key">key值</param>
        /// <param name="value">value值</param>
        /// <param name="expiresTime">過期時間,以分鐘為單位</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();
}

在新增一個控制器存取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>
        /// 設定Cookie
        /// </summary>
        [HttpGet]
        [Route("SetCookie")]
        public void Get()
        {
            _helper.SetCookie("cookieHelperKey", "cookieHelperValue");
            // 設定過期時間
            _helper.SetCookie("cookieHelperExpiresKey", "cookieHelperExpitesValue",10);
        }

        /// <summary>
        /// 根據key獲取Cookie的Value值
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        [Route("GetCookie")]
        public string GetCookid()
        {
            return _helper.GetCookie("cookieHelperKey");
        }

        /// <summary>
        /// 根據key刪除Cookie
        /// </summary>
        [HttpGet]
        [Route("DeleteCookie")]
        public void DeleteCookie()
        {
            _helper.DeleteCookie("cookieHelperKey");
        }
    }
}

執行程式,首先存取設定Cookie的方法:

可以看到,已經我們設定的Cookie資訊了。

接下來存取獲取Cookie:

可以根據key獲取到對應的value值。

最後存取刪除Cookie:

可以看到,key對應的cookie已經被刪除了。

GitHub原始碼地址:https://github.com/jxl1024/Cookie

到此這篇關於ASP.NET Core在WebApi專案中使用Cookie的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com