.NET Core:在ASP.NET Core WebApi中使用Cookie


一、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時指定如下的附加屬性:

  1. 域:用於指定與Cookie關聯的域。
  2. 過期時間:用於指定Cookie的過期時間。
  3. 路徑:用於指定Cookie路徑。
  4. 安全策略:用於指定Cookie是否可以通過HTTPS訪問。
  5. 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源碼地址:git@github.com:jxl1024/Cookie.git


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM