一、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. css 层叠上下文和层叠顺序

    层叠上下文是css中的一个三维概念,拥有层叠上下文的元素在z轴上比普通元素要高,而且其内部的所有内容是自成体系的,其后代都是在它的层叠顺序中 哪些元素拥有层叠上下文 1.根元素,也就是html默认拥有 ...

  2. C++ 11 多线程初探-std::memory_order

    std::memory_order(可译为内存序,访存顺序) 动态内存模型可理解为存储一致性模型,主要是从行为(behavioral)方面来看多个线程对同一个对象同时(读写)操作时(concurren ...

  3. python使用笔记24--面向对象编程2

    类方法 类里面自带的方法,不用实例化就可以调用,想象,模型上自带的功能 类方法是公共的,在实例方法里面可以随意调用 但是在类方法里不能调用实例方法,不能使用实例变量,但是他可以调用其他的类方法 1 @ ...

  4. python从图片中找图

    import aircv as ac def matcha(bb,aa):#从bb查找aa,如果有则返回其坐标位置 yuan=ac.imread(bb) mubi=ac.imread(aa) resu ...

  5. 【LeetCode】66. 加一

    66. 加一 知识点:数组: 题目描述 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一. 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字. 你可以假设除了整数 0 ...

  6. aptitude软件状态标志i、v、p

    输出的结果分三栏,分别为状态.包名和描述.而状态则由p.i.v等字母表示.查询后才知道这些标识的含义是这样的: i - 包已经成功安装,并且所有依赖都满足. c - 包已经被移除,但是配置文件被保留. ...

  7. 未开通js之前的纯css网页主题

    本主题修改自其他大佬:Rocket1184/MaterialCnblogs: Material Theme for cnblogs.com (github.com) 只需在博客后台选择"禁用 ...

  8. mybatis介绍以及配置

    一.概念 1.作用:简化dao层,是框架的一部分,常叫SSM,或SSI 2.历史:之前的版本叫ibatis,三版之后叫mybatis 3.什么是orm?object,relational,mappin ...

  9. SpringBoot之yaml语法及静态资源访问

    配置文件-yaml 在spring Boot开发中推荐使用yaml来作为配置文件. 基本语法: key: value:kv之间有空格 大小写敏感 使用缩进表示层级关系 缩进不允许使用tab,只允许空格 ...

  10. C#制作网盘搜索工具(简单的爬虫)

    最近学习C#编程,在网上发现一篇winform下制作百度网盘搜索器的文章,故而下载源码学习一二.无奈原博所用的网址失效,故而自己改写了网址和相关源代码,也进行了实现.因为初学,接触的知识较多,为免忘记 ...