.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

posted @ 2020-07-02 23:11  .NET开发菜鸟  阅读(10066)  评论(1编辑  收藏  举报