C#中Request.Cookies 和 Response.Cookies 的区别分析
作者:hebedich 时间:2023-07-10 07:24:59
.NET中提供了读写Cookie的多种方法,Request.Cookies 是客户端通过 Cookie 标头形式由客户端传输到服务器的 Cookie;Response.Cookies 在服务器上创建并以 Set-Cookie 标头的形式传输到客户端。也就是说,一个是客户端向服务器端发送的来的,一个是服务器发送到客户端的。
第一次创建Cookies的时候,下面的2种读取方法读取到的内容是一样:
C# 代码
HttpCookie hc = new HttpCookie("User2");
hc["UserName"] = "mengxianhui";
Response.Cookies.Add(hc);
Response.Cookies["User1"]["UserId"] = "net_lover";
Response.Write(Request.Cookies["User1"].Values["UserId"].ToString());
Response.Write(Request.Cookies["User2"].Values["UserName"].ToString());
Response.Write("<hr>");
Response.Write(Response.Cookies["User1"].Values["UserId"].ToString());
Response.Write(Response.Cookies["User2"].Values["UserName"].ToString());
但是,一旦Cookie存在,再使用上面的方法进行读取,结果是有差别的,Response.Cookies可以立即读取到新的Cookie,而Request.Cookies读取到仍是上一次设置的,也就是必须通过客户端向服务器发送请求时才能读取到。为什么会有这样的差别,应该是.NET实现的问题,里面有这么一段:
C# 代码
if (includeResponse && (this.Response != null))
{
HttpCookieCollection cookies = this.Response.Cookies;
if (cookies.Count > 0)
{
HttpCookie[] dest = new HttpCookie[cookies.Count];
cookies.CopyTo(dest, 0);
for (int i = 0; i < dest.Length; i++)
{
cookieCollection.AddCookie(dest[i], true);
}
}
}
在Cookie不存在时,它应该是读取Response.Cookies里面的Cookie了,所以第一次读取相同,而以后读取不同的原因吧。
另外,Response.Cookies必须是在设置完后读取,不能像Request.Cookies那样随时读取,如在别的页面读取Cookies,下面的方法就是错误的
C# 代码
protected void Page_Load(object sender, EventArgs e)
{
Response.Write(Response.Cookies["User1"].Values["UserId"].ToString());
Response.Write(Response.Cookies["User2"].Values["UserName"].ToString());
}
总结:
Request.Cookies:主要是用于获取所有Cookie值的,包括JS、Request.Cookies和Response??.Cookies三种方法创建的Cookie值;说到这里,大家可以看出Request.Cookies既可以获取Cookie也可以创建Cookie,那么它创建的Cookie与Response和JS创建的Cookie有什么不用呢,通过实验发现,通过Request.Cookies创建的Cookie只有?Request.Cookies才能获取到,而其他两种方法是不能获取的,也就是说Request.Cookies创建的Cookie只能用于.Net后台不能用于HTML的前台。
Response.Cookies:主要用于Cookie的创建、赋值和删除操作,经过?Response.Cookies操作过的Cookie,所有方法获取到的都是被更新过的值,也就是说Response.Cookies是修改所有容器中的Cookie的值;Response.Cookies除了是Cookie的终极修改者外,我们在写代码的时候可能会发现通过Response.Cookies也可以得到部分Cookie的值,通过实验发现,此处获取的Cookie值只是本次会话中且是通过Response.Cookies创建的Cookie,基本上没什么用处。
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Java实现简单猜数字小游戏
![](https://img.aspxhome.com/file/2023/2/59052_0s.jpg)
Java实现分布式系统限流
Android编程实现应用强制安装到手机内存的方法
通过实例了解Java 8创建Stream流的5种方法
![](https://img.aspxhome.com/file/2023/8/77398_0s.jpg)
Android Studio项目中导入开源库的方法
Java使用RedisTemplate如何根据前缀获取key列表
![](https://img.aspxhome.com/file/2023/9/78909_0s.png)
Android N多窗口支持
![](https://img.aspxhome.com/file/2023/2/93302_0s.jpg)
Android开发Popwindow仿微信右上角下拉菜单实例代码
![](https://img.aspxhome.com/file/2023/5/138325_0s.png)
C# 调用Delphi dll 实例代码
基于C#实现简单离线注册码生成与验证
Android多渠道打包的方法步骤
![](https://img.aspxhome.com/file/2023/4/91024_0s.png)
C#获取文件夹所占空间大小的功能
Android中AlertDilog显示简单和复杂列表的方法
ajaxFileUpload插件,C#返回Json数据报错问题的解决方案
![](https://img.aspxhome.com/file/2023/0/91360_0s.png)
详解Java 中 RMI 的使用
![](https://img.aspxhome.com/file/2023/5/98705_0s.jpg)
Java用freemarker导出word实用示例
![](https://img.aspxhome.com/file/2023/5/86715_0s.png)
安卓版微信小程序跳一跳辅助
![](https://img.aspxhome.com/file/2023/4/109194_0s.jpg)
浅谈Java并发中的内存模型
![](https://img.aspxhome.com/file/2023/3/62093_0s.png)
springboot 自定义启动器的实现
![](https://img.aspxhome.com/file/2023/7/72567_0s.png)
SpringBoot @Cacheable自定义KeyGenerator方式
![](https://img.aspxhome.com/file/2023/9/88069_0s.png)