浏览器 cookie 中的 ASP.NET MVC TempData

2023-11-30

我正在尝试使用自定义ITemp数据提供者提供者到存储TempData在浏览器的 cookie 而不是会话状态中。但是,一切工作正常,只是我无法在读取 cookie 后将其从响应流中删除。

有任何想法吗?
谢谢!

public class CookieTempDataProvider : ITempDataProvider
    {
        internal const string TempDataCookieKey = "__ControllerTempData";
        HttpContextBase _httpContext;

        public CookieTempDataProvider(HttpContextBase httpContext)
        {
            if (httpContext == null)
            {
                throw new ArgumentNullException("httpContext");
            }
            _httpContext = httpContext;
        }

        public HttpContextBase HttpContext
        {
            get
            {
                return _httpContext;
            }
        }

        protected virtual IDictionary<string, object> LoadTempData(ControllerContext controllerContext)
        {
            HttpCookie cookie = _httpContext.Request.Cookies[TempDataCookieKey];
            if (cookie != null && !string.IsNullOrEmpty(cookie.Value))
            {
                IDictionary<string, object> deserializedTempData = DeserializeTempData(cookie.Value);

                // Remove cookie                
                cookie.Expires = DateTime.MinValue;
                cookie.Value = string.Empty;
                _httpContext.Request.Cookies.Remove(TempDataCookieKey);

                if (_httpContext.Response != null && _httpContext.Response.Cookies != null)
                {
                    HttpCookie responseCookie = _httpContext.Response.Cookies[TempDataCookieKey];
                    if (responseCookie != null)
                    {
                        // Remove cookie
                        cookie.Expires = DateTime.MinValue;
                        cookie.Value = string.Empty;
                        _httpContext.Response.Cookies.Remove(TempDataCookieKey);

                    }
                }

                return deserializedTempData;
            }

            return new Dictionary<string, object>();
        }

        protected virtual void SaveTempData(ControllerContext controllerContext, IDictionary<string, object> values)
        {

            string cookieValue = SerializeToBase64EncodedString(values);  
            var cookie = new HttpCookie(TempDataCookieKey);
            cookie.HttpOnly = true;
            cookie.Value = cookieValue;

            _httpContext.Response.Cookies.Add(cookie);
        }

        public static IDictionary<string, object> DeserializeTempData(string base64EncodedSerializedTempData)
        {
            byte[] bytes = Convert.FromBase64String(base64EncodedSerializedTempData);
            var memStream = new MemoryStream(bytes);
            var binFormatter = new BinaryFormatter();
            return binFormatter.Deserialize(memStream, null) as IDictionary<string, object> /*TempDataDictionary : This returns NULL*/;
        }

        public static string SerializeToBase64EncodedString(IDictionary<string, object> values)
        {
            MemoryStream memStream = new MemoryStream();
            memStream.Seek(0, SeekOrigin.Begin);
            var binFormatter = new BinaryFormatter();
            binFormatter.Serialize(memStream, values);
            memStream.Seek(0, SeekOrigin.Begin);
            byte[] bytes = memStream.ToArray();
            return Convert.ToBase64String(bytes);
        }

        IDictionary<string, object> ITempDataProvider.LoadTempData(ControllerContext controllerContext)
        {
            return LoadTempData(controllerContext);
        }

        void ITempDataProvider.SaveTempData(ControllerContext controllerContext, IDictionary<string, object> values)
        {
            SaveTempData(controllerContext, values);
        }
    }

Brock Allen 在 GitHub 上提供了一个更好的解决方案,它使用加密、两种形式的序列化和压缩来保护和优化 cookie。

https://github.com/brockallen/CookieTempData

这是有关它的博客的链接:

http://brockallen.com/2012/06/11/cookie-based-tempdata-provider/

他还拥有使用 IControllerFactory 的良好技术来确保为每个控制器提供 ITempDataProvider 实例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

浏览器 cookie 中的 ASP.NET MVC TempData 的相关文章

  • 将 cookie 作为 node.js 请求的一部分传递

    我正在使用request包来创建我的服务器端请求 我编写了身份验证中间件 用于检查所有请求的 cookie 会话 ID 因此 有没有办法将用户的 cookie 作为请求的一部分包含在内 这是我当前的代码 var cookie parseCo
  • 在 HttpAuthenticationContext 中为 IAuthenticationFilter 设置 Cookie 值

    我需要在 WebAPI 管道的身份验证步骤中读取 写入 cookie 我为此创建了一个自定义过滤器 为了遵守自托管概念 访问 cookie 并将其写入客户端的安全方法是什么 里克 斯特拉尔 http weblog west wind com
  • asp.net mvc 镜像路径和虚拟目录

    我知道这必须是重复的 但我一直在翻阅大量有关此的信息 但无法使其发挥作用 我正在尝试让一个网站在客户端的服务器上运行 并且他们将该网站安装在虚拟目录中 我本地没有这个设置 所以我在这里盲目飞行 我正在尝试建立一条通往图像的路径 用于 Fac
  • 从 TempData 转换对象集合 (MVC C#)

    我试图将我的对象集合放入 TempData 中 如下所示 HttpPost public ActionResult PandoraRemovalTotal2 List
  • 创建持久的 php 登录 cookie 会话

    我试图让我的登录会话持续更长时间 这样人们就不会过早退出我的网站 例如 制作一篇博客文章并在提交时丢失 因为 php 的 cookie 过期了 理想情况下 我想给他们一个 2 小时的会话 他们不会注销 每次加载页面时都会刷新 下面的代码片段
  • 如何使用 Java 以编程方式登录 Facebook?

    我正在尝试编写一个可以自动登录 Facebook 的 Java 程序 到目前为止 我已经得到了以下代码 可以将主页 html 页面下载到字符串中 但不知道如何发送电子邮件和密码来登录 Facebook Java 程序还需要处理返回的 coo
  • 错误:$.cookie 不是函数

    我使用以下代码添加了 jQuery 插件 我的激活cookie的代码如下 document ready function ul sub menu a click function sliderid prodcls css display n
  • 为什么我们在 Javascript 中将秒乘以 1000 来添加时间

    我正在研究 cookie 我在 Stack Overflow 上发现了一些问题 这些问题已经得到解答 我在问题中看到答案将秒乘以 1000 我想知道 getTime 返回什么格式 这需要乘以 1000 让cookie在30秒后过期 http
  • Angular 2/4 存储令牌的位置

    我有一个用于生成令牌的 REST API 我在 Angular 4 客户端中使用它 但问题是在哪里存储该令牌 在互联网上我发现我可以存储在本地存储或cookie中 所以我的问题是 如果存储令牌是本地存储 并且我刚刚从另一个浏览器复制了有效令
  • 如何跟踪用户在网站上的使用情况?

    我正在使用 PHP MYSQL 每次用户登录时 我们都会插入他们登录的时间和登录日期 虽然我们很容易知道特定一天有多少用户登录 但我不确定如何计算他们在网站上花费的时间 例如 就像用户登录并将记录插入到 login tracking 表中一
  • Safari 不设置 cookie,但 Chrome 和 Firefox 会设置

    我正在将请求从本地主机发送到第三方服务器以使用 REST API 获取数据 后端使用cookies JSESSIONID 来了解是否发送数据 在 Chrome 中一切正常 我可以在 Chrome 浏览器的 应用程序 选项卡中看到 Cooki
  • 切换到负载均衡器后,django 帖子收到 CSRF 验证失败

    我有一个有效的登录模板 可以发布帖子 如下所示
  • 在 ASP.Net MVC 中向“View/Shared”文件夹添加子目录并调用视图

    我目前正在使用 ASP Net MVC3 和 Razor 开发一个网站 在 View Shared 文件夹中 我想添加一个名为 Partials 的子文件夹 我可以在其中放置所有部分视图 为了更好地组织网站 只要我在调用视图时始终引用 Pa
  • 在 Javascript 中设置多个 cookie

    我正在尝试设置多个 cookiedocument cookie 但不幸的是只有一个被添加 我知道网上有多个设置此类 cookie 的示例 我遵循了其中之一 但我仍然无法解决这个问题 我跟着这个link http www elated com
  • 如何注销多个非当前用户的会员用户?

    我正在使用属于 MVC2 默认项目一部分的 MembershipProvider 我希望能够获取用户名列表 注销用户 并在需要时销毁他们的会话 我能想到的最接近的是 foreach string userName in UserNames
  • 在Android中存储和恢复cookie(持久cookie存储)

    搜索了很多 我有一个应用程序 应用程序登录服务器并接收一些cookie 然后它可以使用它们执行一些POST请求 例如获取用户个人资料 我想在会话之间存储它们 这意味着我可以重新启动设备 运行应用程序并获取配置文件 而无需额外登录 或者 换句
  • 使用 Rails 自动登录?

    我正在尝试使用 Rails 的 Restful Authentication 插件建立一个简单的身份验证系统 我只是想知道它是如何工作的 b c 我似乎无法弄清楚 cookie 的要求是什么 以及如何做到这一点浏览器始终会记住您 6 个多月
  • 为什么 Chrome 审核建议我最小化 Cookie 大小?

    如何最小化请求的 cookie 大小 Chrome 似乎 警告我 我的 cookie 大小为 41B 这根本不是很多 但是它警告我有什么原因吗 这是一个 PHPSESSID cookie 我真的不知道如何最小化它 有任何想法吗 我的请求响应
  • ASP.NET MVC 2 - 使用 UpdateModel 和 LINQ to Entities (.NET 3.5) 时“无法更新类型‘XYZ’的模型”

    我有一个使用 LINQ to Entities 设置的模型 并且代码可以按预期添加到数据库中 但是 当我使用 NET 3 5 时 我无法让 UpdateModel 工作 HttpPost public ActionResult Edit S
  • nginx代理认证拦截

    我有几个服务 它们支持 nginx 实例 为了处理身份验证 在 nginx 中 我拦截每个请求并将其发送到身份验证服务 在那里 如果凭据正确 我将设置一个包含用户相关信息的 cookie 现在 请求应该被路由到适当的服务 并设置 cooki

随机推荐

  • 如何显示和隐藏 UISearchDisplayController 的 UISearchBar

    我有一个位于导航右侧的按钮搜索 这是我的代码 UIButton btnSearch UIButton buttonWithType UIButtonTypeCustom btnSearch frame CGRectMake 0 0 22 2
  • Fabric.io 中的 API 密钥和 Build Secret 有什么区别?

    我在 Android 应用程序中使用 Fabric io 的 Crashlytics 工具 我已将 API 密钥放入清单文件中 Fabric 还提供了构建秘密字符串 但没有使用说明 Fabric 可能假设用户事先了解如何使用 BUILD S
  • 映射 servlet 来满足我的请求

    我想映射一个 servlet 来服务包含 app 并以 html 结尾的请求 如下所示
  • 使用 GSON 加载非常重的流

    我正在尝试读取非常重的 JSON 超过 6000 个对象 并将它们存储在哈希映射上 以便稍后将其插入到我的数据库中 但问题是我面临 OOM 这是我沉重的 JSON 造成的 但是 GSON 库应该让我摆脱这种情况 但事实并非如此 有任何想法吗
  • 获取默认选择颜色?

    I can change theCSS选择颜色 但我怎样才能get浏览器 操作系统默认选择以便我可以在其他地方使用它 例如在 Ubuntu Chrome 上 文本以橙色突出显示 我想将同样的风格应用到 li 当我用鼠标悬停在它上面时 CSS
  • 全局检测触摸

    我试图弄清楚如何解决这个 相当 简单的问题 但我失败得很惨 所以我真的需要你的建议 我的应用程序由一个带有多个选项卡的 uitabbar 组成 在其中一个中 我有一堆 UIImageView 每个视图代表图片的缩略图 类似地 当您通过按住应
  • 在C++中,为什么指针转换时地址会改变?

    以下是代码 include
  • 使用现有基类对象创建派生类对象?

    是否有可能 或快速解决方法 创建定义为派生类的对象 而无需在内存中创建基类对象 相反 派生对象应该引用基类实际存在的对象 接管 其内存驻留 出于速度原因 这是需要的 创建新的派生对象 将数据从基类对象复制到它 然后销毁基对象需要太多时间 在
  • Java ArrayList.add() 方法对于纯并行添加线程安全吗? [复制]

    这个问题在这里已经有答案了 考虑一个函数的 for 循环 该函数接受 ArrayList 引用并向该 ArrayList 添加一个对象 我现在想并行执行每个函数调用 如果我不关心对象添加的顺序并且没有函数读取或操作任何 ArrayList
  • Google App Engine - 将 Blobstore API 与 Google Cloud Storage 结合使用

    我必须存储大小超过 1MB 的文件 谷歌应用程序引擎建议我应该将它们存储在谷歌云存储中 应用程序引擎 BlobProperty 不适合 这部分将 Blobstore API 与 Google Cloud Storage 结合使用建议使用 c
  • Microsoft 语音识别 setInputToDefaultAudioDevice 引发异常

    大家好 我在 MS 语音识别方面遇到了麻烦 我的代码很简单 static void init string enUsEngine string Empty foreach RecognizerInfo ri in SpeechRecogni
  • Office Starter 是否包含 Microsoft.Office.Interop 的 DLL?

    我想使用 Microsoft Office Interop Excel 从 XLS 文件中提取一些数据 我安装了 Visual Studio 2010 和 Office 开发人员工具 但是 我在以下位置收到 COMException 错误v
  • Jekyll 链接集合中的文档?

    在 Jekyll 的 Front Matter 中 有没有办法引用另一个文档 我有一个自定义集合 并且想在每个文档中添加元数据 例如 父主题 指向父主题的链接 和 子主题 文档数组 或 相关主题 通过这样的引用 我可以访问链接文档的元数据
  • 修改组件的状态然后调用“setState(this.state)”是一个好习惯吗?

    我正在使用 ReactJS 我有一个有状态组件 秒表容器 和多个无状态子组件 秒表 在外部组件中 我正在做这样的事情 the outer component is a container for multiple stopwatches t
  • 使用 window.onload 使用 Javascript 进行表单验证

    你好 我真的很困惑 因为我是一个 javascript 初学者 这让我很困惑 有人知道如何编写以下 javascript 表单验证吗 我确信这很简单 但我想不出这个来救我的命 感谢您分享您的知识 我需要在没有 jquery 的情况下编写以下
  • 是否可以在没有实体的情况下使用 JpaRepository ?

    是否可以使用JpaRepository没有实体 在这种情况下 将其替换为 DTO 如下示例 Repository public interface BffRepository extends JpaRepository
  • 从另一个 Stencil JS 库导入 Stencil JS 库

    我有两个 Stencil JS Web 组件库 library a 和library b 这些不是应用程序 只是单独的 npm 组件包 我想使用library a 和library b 中的一些组件 如何将组件从 A 导入到 B 中 Ste
  • 在Python中交换列表中的元素

    我有一个列表 我需要将列表中的第一个元素与列表中的最大元素交换 但为什么代码 1 可以工作 而代码 2 却不能 code 1 a list index max list list 0 list a list a list 0 code 2
  • 让用户使用 VBA 单击单元格作为 Excel 输入框的输入

    我有一个将用户输入存储到变量中的输入框 用户输入的输入是手机号码 例如 弹出输入框询问用户 您想从哪里开始 然后 用户可以输入 A4 或他们想要启动的任何单元格 我的问题是 有没有办法允许用户物理单击单元格 A4 而不是键入它 预先感谢您的
  • 浏览器 cookie 中的 ASP.NET MVC TempData

    我正在尝试使用自定义ITemp数据提供者提供者到存储TempData在浏览器的 cookie 而不是会话状态中 但是 一切工作正常 只是我无法在读取 cookie 后将其从响应流中删除 有任何想法吗 谢谢 public class Cook