当大小限制开始时,cookie的最佳替代品

本文关键字:cookie 最佳 替代品 开始时 | 更新日期: 2023-09-27 18:15:33

我一直在处理一个相当大的数据库。我想填充网页的网页控件(下拉列表)在页面加载事件,给网页尽可能多的灵活性。例如,我有一个下拉列表,用户可以选择,它将从数据表的特定列的唯一行填充。

现在,我不想在每次页面加载发生时触发oracle查询,因为这会显着减慢网页速度(每次大约1分钟)。所以我开始考虑用饼干来解决问题。我很快发现cookie的大小限制(4kb)对于我的目的来说太小了。如果我真的想在本地存储数据,我将需要大约10-15kb的大小!因此,我试图搜索是否有任何方法可以增加cookie大小限制以满足我的需求,我发现可能的解决方案是localstorage。

  1. 真的有办法增加cookie大小限制吗?
  2. 最简单的替代方案是什么?它真的是本地存储吗?或者还有什么要调查的?

详细信息:我使用c#/ASP。. NET + ORACLE

当大小限制开始时,cookie的最佳替代品

以下是所有在ASP中存储状态信息的选项。Net -

  • Cache—存储在服务器上并在用户之间共享的内存池
  • 会话 -存储在服务器上,对于每个用户都是唯一的
  • Cookies -存储在客户端,并与每个HTTP请求一起传递给服务器
  • QueryString -作为完整URL字符串的一部分传递
  • 上下文。Items - HttpContext并且只持续该请求的生命周期
  • 配置文件—存储在数据库中并跨多个会话维护信息

现在,我不想在每次页面加载发生时触发oracle查询因为这会大大减慢网页的速度(大约1分钟)每次)。

您的场景有两个选项-

  • 如果数据是跨用户共享的,使用Cache
  • 如果每个用户的数据都是唯一的,则使用Session

理想情况下,你不想存储在ViewState它会使你的页面非常沉重,除非你配置存储在Sql Server的ViewState(这是超出这个问题的范围)。

更新:

localStorage -不是所有的浏览器都可以处理localStorage,所以一定要先检查一下。

<script type="text/javascript">
   if(window.localStorage)  {
      window.localStorage.SetItem('keyName','valueToUse');
      // OR
      window.localStorage.keyName = 'valueToUse';
   }
</script>

供参考: ASP。NET没有提供处理本地存储的特定方法;你只能通过javascript在客户端操作。

不要使用cookie

我一直在开发的一个应用程序中也有类似的需求。我需要让用户使用自动完成输入框从大约15,000个选项中选择一个值。我不想在组件每次需要查找值时都访问数据库。我决定使用会话存储来存储所有可能的值,然后将这些值提供给自动完成组件。效果很好。你也可以使用本地存储

对于我的需求,会话存储是一个更好的选择,因为我不需要在用户关闭浏览器选项卡后保存值。此外,在将15,000项存储到会话存储中之前,我使用JavaScript压缩对它们进行了压缩,以节省空间。我使用lz-string进行压缩

您不希望将cookie用于此目的。不仅有大小限制,而且cookie会随着每个向服务器发出的请求来回发送,这可能会降低应用程序的响应速度,具体取决于服务器和用户的带宽。

另一种选择是使用Viewstate,它将数据存储在页面本身。这没有空间限制,但它确实有与增加请求大小的cookie相同的问题。

您还可以使用Session,它将为每个会话将数据存储在服务器的内存中。这减少了带宽需求,但确实占用了服务器本身的额外内存空间,这可能是不可取的。内存中的大量数据+大量会话可能=内存不足。

所以要弄清楚你的权衡是什么。Viewstate与您当前的解决方案最相似。

要访问页面中的视图状态或会话,只需执行Viewstate['KEY']Session['KEY']

另一件需要注意的事情是,Session数据在整个会话和页面加载/重定向等过程中都是持久化的。Viewstate仅对该页可用。如果转到其他页面,Viewstate将被丢弃。

如果所有用户的数据都是相同的,那么您还可以使用Cache,它将数据存储在应用程序级别而不是会话级别。这仍然占用服务器上的内存空间,但不会随着会话的增加而增加(在您的示例中仅为15k !)您还可以为缓存指定过期时间(滑动过期或绝对过期),这允许您在一定时间内不访问该资源时自动释放正在使用的内存。只要确保在使用它之前总是检查数据是否在缓存中,因为。net将在信息过期时丢弃该信息,或者如果它只是需要为某些其他目的清理内存