一、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

.NET Core:在ASP.NET Core WebApi中使用Cookie的更多相关文章

  1. ASP.NET Core 用户注册 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 用户注册 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 用户注册 上一章节我们终于迁移完了 Identity 的数据,也创建 ...

  2. ASP.NET Core 视图 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 视图 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 视图 花了几章节,终于把 ASP.NET Core MVC 中的 C 控 ...

  3. ASP.NET Core 路由 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 路由 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 路由 前两章节中,我们提到 ASP.NET Core 支持 MVC 开发 ...

  4. ASP.NET Core 中间件 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 中间件 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 中间件 上一章节中,我们我们有讲到 Startup 类中的 Confi ...

  5. ASP.NET Core 简介 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 简介 - ASP.NET Core 基础教程 - 简单教程,简单编程 ← ASP.NET Core 基础教程 ASP.NET Core Windows 环境配置 → A ...

  6. ASP.NET Core:ASP.NET Core中使用NLog记录日志

    一.前言 在所有的应用程序中,日志功能是不可或缺的模块,我们可以根据日志信息进行调试.查看产生的错误信息,在ASP.NET Core中我们可以使用log4net或者NLog日志组件来实现记录日志的功能 ...

  7. 【.NET Core】ASP.NET Core之IdentityServer4(1):快速入门

    [.NET Core]ASP.NET Core之IdentityServer4 本文中的IdentityServer4基于上节的jenkins 进行docker自动化部署. 使用了MariaDB,EF ...

  8. K8S+GitLab-自动化分布式部署ASP.NET Core(二) ASP.NET Core DevOps

    一.介绍 前一篇,写的K8S部署环境的文章,简单的介绍下DevOps(Development和Operations的组合词),高效交付, 自动化流程,来减少软件开发人员和运维人员的沟通.Martin ...

  9. 【ASP.NET Core】ASP.NET Core 依赖注入

    一.什么是依赖注入(Denpendency Injection) 这也是个老身常谈的问题,到底依赖注入是什么? 为什么要用它? 初学者特别容易对控制反转IOC(Iversion of Control) ...

随机推荐

  1. java二叉树的遍历(1)

    树(tree)是一种抽象数据类型(ADT),用来模拟具有树状结构性质的数据集合.它是由n(n>0)个有限节点通过连接它们的边组成一个具有层次关系的集合 节点:上图的圆圈,比如A,B,C等都是表示 ...

  2. XDFZOI 月赛 201905 Sliver

    组题人自己组完过后,才发现自己还是太弱了... T1 简单模拟. 按照游戏规则直接模拟显然是不明智的,所以我们可以像石头剪刀布一样,将判断改变为检验. 同时,我们发现,一共只有48种牌,所以我们可以直 ...

  3. etcd的使用

    etcd的使用 什么是etcd etcd的特点 etcd的应用场景 服务注册与发现 消息发布和订阅 负载均衡 分布式通知与协调 分布式锁 分布式队列 集群监控与Leader竞选 参考 etcd的使用 ...

  4. SHELL 变量一

    SHELL变量分为三类:本地变量.环境变量和位置参数 变量存在三种基本结构:变量名.操作符(个人定义).变量值 比如:var=blue 变量名:var 操作符:= 变量值:blue 变量的设置规则: ...

  5. python twain

    self.SD.SetCapability(twain.CAP_DUPLEXENABLED, twain.TWTY_BOOL, 0) #单面扫描 self.SD.SetCapability(twain ...

  6. Java基础00-多线程28

    1. 实现多线程 1.1 进程 1.2 线程 1.3 多线程的实现方式(方式一:继承Thread类) 代码示例:定义类MyThread: //1:定义一个类MyThread继承Thread类 publ ...

  7. 国产深度学习框架mindspore-1.3.0 gpu版本无法进行源码编译

    官网地址: https://www.mindspore.cn/install 所有依赖环境 进行sudo make install 安装,最终报错: 错误记录信息: cat     /tmp/mind ...

  8. ecshop二次开发笔记--订单表结构ecs_order_info说明

    -- 表的结构 `ecs_order_info`  CREATE TABLE IF NOT EXISTS `ecs_order_info` (  `order_id` mediumint(8) uns ...

  9. js里的发布订阅模式及vue里的事件订阅实现

    发布订阅模式(观察者模式) 发布订阅模式的定义:它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知. 发布订阅模式在JS中最常见的就是DOM的事件绑定与触发 ...

  10. fiddler抓取手机模拟器数据

    引自:https://blog.csdn.net/lengdaochuqiao/article/details/88170522 1.下载最新版fiddler ,强烈建议在官网下载:https://w ...