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

摘要:
Cookie以键/值对的形式表示。您可以使用密钥读取、写入或删除cookie。在ASP中,也可以在NETCore中使用Cookie来维护回声状态。包含echo ID的Cookie将随每个请求一起发送给客户端。HttpOnly:用于指定cookie是否仅对服务器可用。
一、Cookie的作用

Cookie通常用来存储有关用户信息的一条数据,可以用来标识登录用户,Cookie存储在客户端的浏览器上。在大多数浏览器中,每个Cookie都存储为一个小文件。Cookie表示为键/值对的形式,可以利用键来读取、写入或删除Cookie。

在ASP.NET Core中也可以使用Cookie来维护回话状态,包含回话ID的Cookie会随着每个请求一起发送到客户端。

二、在ASP.NET Core中使用Cookie

我们创建一个ASP.NET Core WebApi的项目,然后在WebApi中测试使用Cookie。

.NET Core:在ASP.NET Core WebApi中使用Cookie第1张

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

在项目中添加一个控制器,用来测试Cookie:

.NET Core:在ASP.NET Core WebApi中使用Cookie第2张

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信息:

.NET Core:在ASP.NET Core WebApi中使用Cookie第3张

我们看到,这里只有一个Cookie信息,接下来方法SetCookie方法:

.NET Core:在ASP.NET Core WebApi中使用Cookie第4张

我们看到,这里已经有我们刚才添加的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"];
        }
    }
}

运行程序,查看效果:

.NET Core:在ASP.NET Core WebApi中使用Cookie第5张

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的效果:

.NET Core:在ASP.NET Core WebApi中使用Cookie第6张

接下来我们访问删除Cookie的方法:

.NET Core:在ASP.NET Core WebApi中使用Cookie第7张可以看到,刚才的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,所以需要创建一个单独的类库:

.NET Core:在ASP.NET Core WebApi中使用Cookie第8张

接下来创建一个接口,里面封装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的方法:

.NET Core:在ASP.NET Core WebApi中使用Cookie第9张

可以看到,已经我们设置的Cookie信息了。

接下来访问获取Cookie:

.NET Core:在ASP.NET Core WebApi中使用Cookie第10张

可以根据key获取到对应的value值。

最后访问删除Cookie:

.NET Core:在ASP.NET Core WebApi中使用Cookie第11张

可以看到,key对应的cookie已经被删除了。

GitHub源码地址:git@github.com:jxl1024/Cookie.git

免责声明:文章转载自《.NET Core:在ASP.NET Core WebApi中使用Cookie》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇oracle 错误 TNS-01190与oracle 登入没反应操作解决 01-Jul-2016 10:49:05.875 WARNING [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc The web application [ROOT] registered the JDBC driver [com.mysql.jdbc.D下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

洛谷 2957 [USACO09OCT]谷仓里的回声Barn Echoes

题目描述 The cows enjoy mooing at the barn because their moos echo back, although sometimes not completely. Bessie, ever the excellent secretary, has been recording the exact wording...

利用LDAP操作AD域

LDAP操作代码样例  初始化LDAP 目录服务上下文 该例子中,我们使用uid=linly,ou=People,dc=jsoso,dc=net这个账号,链接位于本机8389端口的LDAP服务器(ldap://localhost:8389),认证方式采用simple类型,即用户名/密码方式。 private static void initialConte...

SQLServer 的存储过程与java交互

一、   存储过程简介 Sql Server的存储过程是一个被命名的存储在服务器上的Transacation-Sql语句集合,是封装重复性工作的一种方法,它支持用户声明的变量、条件执行和其他强大的编程功能。 存储过程相对于其他的数据库访问方法有以下的优点:    (1)重复使用。存储过程可以重复使用,从而可以减少数据库开发人员的工作量。     (2)...

sqlmap介绍与使用案例

作者:虫儿飞ZLEI链接:https://www.jianshu.com/p/3d3656be3c60来源:简书著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 sqlmap介绍与使用案例 1.sqlmap简介 最白话的介绍就是sqlmap是一个工具,一个用来做sql注入攻击的工具 2.windows安装python2 这个sqlmap...

导出 Excel 模板自动生成规则,避免用户反复修改

一句话总结 Excel 导出、导入时,根据注解自动添加单元格验证规则,避免用户因填写错误的枚举字段而反复修改 Excel 需求背景 对于 Java Web 项目,总是不可避免的出现 Excel 导入、导出的需求,而 Excel 导入导出时,枚举字段和枚举值的映射是非常常见的一种情况 例如:下面这张示例中的性别列 数据库表结构: Excel 中用户需要输入...

DateUtil

public class GenernalDate { //一天秒数 public final static long MILLISECONDS_OF_DAY = 1000 * 60 * 60 * 24; public final static int NULL_DATE = 19000101; private fi...