当前位置: 首页 > 知识库问答 >
问题:

如何使用具有不同选项卡的同一浏览器处理同一网站的多个会话。ASP。净C#

谯皓君
2023-03-14

如何使用具有不同选项卡的同一浏览器处理同一网站的多个会话。ASP。净C#。例如,如果我们在同一浏览器中打开2个帐户,则不会影响用户详细信息。

共有2个答案

祁鸿哲
2023-03-14

如前所述,session()对用户来说是全局的。事实上,他们可以启动两种不同的浏览器,比如FireFox和Edge,而且他们将继续使用相同的会话值!

这真正意味着,从第一天开始,您的设计就必须做出这样的假设。如果您不做这个简单的假设,那么如果您“突然”编写代码时没有考虑上述概念,那么您可能会受到很大的伤害。

换句话说,对于全局的东西,那么会话()就可以了。但是,如果您开始编写大量代码,这些代码基于使用会话()在单个页面上持久化值?不要!!!

在99%的情况下,将给定页面的代码从会话[]翻转到视图状态[]需要几秒钟。

所以,现在唯一的问题是当我们使用会话[]在页面之间传递值时。

使用session()传递值是可以的,但对于诸如PK行值之类的信息,例如预订酒店房间或选择要购买的房子,则不能使用session()。

然而,像许多人一样,问题是我们没有真正思考这个问题,或者直到为时已晚才知道这个问题。

所以,这是一个问题。您需要session()的“简单”,但我们需要一种在页面之间传递值的方法。

如前所述,一种方法是使用URL中的参数传递值。但话说回来,这相当丑陋。当然,对于某些事情,比如按给定城市过滤网格,那就太好了,因为这样用户就可以保存这样的URL,或者经常根据自己的喜好修改URL。

然而,对于一个简单的选择房子或预订酒店房间来说,你当然不能允许或冒险这样做(因为你会在普通视图中暴露主要的行键和选择。更糟糕的是,这可能是一个巨大的安全风险。(一些非常早期的信用卡和其他类型的网站实际上会让你输入值,让你获取和查看其他用户的信息!!!

因此,以下是您如何处理此问题:

首先,我们有以下简单的选择:

Parameters in URL - they are ugly, high risk, but GREAT for things like city filters etc.

Session() - this is global to the user - includes separate browsers launched.

ViewState - this is per web page - ideal for what we need, and PER PAGE!!!

HiddenFields (in markup) - again, per page - ideal for what we need, but PER PAGE!!!

因此,对于每页选项,只有URL参数可以用于传递。(sans the session()选项)。

ViewState对于每页都很有用,但不能使用ViewState在页面之间传递值。请记住,viewstate是客户端,并且在加密时?

好吧,如果不是超高安全性,那么就可以使用了。请记住,ViewState应该保持较小,因为每次单击按钮和回发都会导致ViewState变为“包”和post的一部分。

ViewState是页面回发的一部分。这当然可以,甚至比普通视图客户端中显示的隐藏字段更好。请记住,ViewState会增加页面中每一篇文章的大小。所以,保持它的轻量级、小型化,不要像某些大型数据集那样保存大量数据。(与Session()不同,Session()是100%服务器端)。

因此,我们需要:简单的方法-每页,但不必重新编写大量代码。

因此,虽然你可以说munge up the URL,但它们看起来真的很难看,虽然这可能会为给定页面提供一个会话,但你的session()代码必须更改,而且会变得很混乱。

因此,只需限制使用会话()来传递值,但不要坚持每页-然后你就可以自由回家了。

有效吗?我的意思是,除非您没有其他合理的选择,否则不要使用Session在页面中持久化值。(使用ViewState)。

另一个问题?建议采用某种方法重新编写大量现有代码有什么好处?

我发现即使是包含相当多会话()内容的页面也可以在不到一分钟的时间内更改为使用ViewState。事实上,在大多数情况下,您可以使用搜索将会话替换为Viewstate。

因此,现在剩下的唯一问题是在页面之间传递值。

自由使用会话将值传递到下一页。但是,对于任何值,例如PK值、行标识值,或者如果要打开多个页面,则会“破坏”或“损坏”该页面操作的值?然后简单地将会话中的值传输到下一页,然后始终在第一页加载时(IsPostBack=false),简单地将值传输到ViewState。

这工作得非常好,并且比尝试在URL中采用一些愚蠢的参数或其他垃圾人提出的任何东西都少工作量。换句话说,我们希望对现有代码的损害最小。

还有,因为会话()是全局的吗?然后它开始变得非常混乱。我想说将4个值传递到下一页。然后在那一页上,我可能会有更多的值——突然间,在编写代码时,你甚至不记得要使用哪个会话()名称——并且它堆积成一个大烂摊子真的很快。你最终会得到一大堆会话值——在你的应用程序中越来越多。这只是一团糟,而全局值在任何应用程序中都往往是一个巨大的混乱——包括使用会话()。

通常,4-5个值是针对特定页面的,因此不要创建4-5 session()值,而是向项目中添加typedef或简单类。并将其用于传递值。它在session()中的混乱程度要小得多,正如您即将看到的,将这些值传输到Viewstate也会更好。

所以,我们现在有了这个:

we adopt and use View Sate for each page.
we ONLY use session to pass values to next page.

让我们举一个简单的例子。

我们说有一个酒店网格——你选择一个。如前所述,对于购买东西、选择酒店等,然后在会话中传递该值是可以的,只要您采用上述规则(我们将值传输到目标页面中的Viewstate)。

这里的目标是允许运行浏览器的多个工作选项卡或副本,当然也允许最小的代码更改。

所以,假设我们有一个GridView,还有一个酒店要预订。

因此,请注意我们传递的值(酒店ID、房型、每晚房价)。

如前所述,我们随后导航到下一页(可能是其他房间详细信息等)-确认预订等。

但是,正如我们所指出的,我们不能再使用会话()了,因为他们可能打开了两个浏览器。见鬼,他们可能在桌面和智能手机上都打开了页面。

那么,当我们到达第二页时,如果两个页面使用会话,我们会遇到巨大的麻烦吗?不,不是我们上面的方法。

因此,我们仍然可以使用session()传递值,但我们不会在该目标页上保留值。换言之,我们将这两个问题分解为:

a) - we using session() to pass values to the next page
b) - we now are NOT using session() to persist values on CURRENT page <<--- this we fix!!!

因此,通过明确我们的目标,作为开发人员,您可以通过对现有代码的简单更改来处理上述问题。正如我所说,作为开发人员,您必须在编写、构建和设计web页面时牢记上述概念。

因此,要在给定页面上持久化值,只需开始使用ViewState代替session()——在大多数情况下,这样的代码不会更改,您保存的所有值和任何值都只属于当前页面。

唯一的主要区别是,用户刷新页面可以重新设置该页面的ViewState(但session()会并且确实会持续存在,所以这里需要一些注意,但不会太多)。

这样做:

按会话()传递值,但在FIRST PAGE加载(IsPostBack=False)上,将值传输到视图状态,就完成了!!

因此,虽然会话()可以并且现在和将来在两个运行的浏览器之间共享?好吧,您单击某些行,将PK放入会话()。现在,假设您跳到下一页,在页面加载时(IsPostBack=false),您将会话值传输到ViewState,现在您有了完整的操作页面——不依赖于会话()。

以上是我找到的最好的解决方案,在大多数情况下,您不必更改代码,也不必引入一些混乱的URL,我发现这些URL更混乱。

宣星光
2023-03-14

浏览器中的所有选项卡共享同一会话(即,将web服务器标识为同一用户),这是默认行为。在某些用例中,您希望每个选项卡都与不同的用户连接到同一个web服务器,这需要通过web应用程序来处理,方法是向URL中的查询字符串或隐藏的表单字段等添加一些特定信息,ASP。NET提供了可用于此场景的无Cookie会话,请参阅此文档。

还有其他博客提供了您可以遵循的示例。其中之一是这个-显示在url路由中使用GUID来区分不同的用户,以及使用唯一窗口名称并使用隐藏表单字段将其发布回服务器的解决方案。

 类似资料:
  • 问题内容: 如何在同一会话中打开新选项卡,我已经尝试了其他人提供的通用解决方案,但无法正常工作。 我正在Chrome浏览器中尝试。 我的项目在Java中 问题答案: 要打开一个, 您可以使用以下代码行: 要打开一个, 您可以使用以下代码行:

  • 问题内容: 我运行foo.com。我在foo.com中有两个不同的应用程序:一个是foo.com/bar,另一个是foo.com/example。我使用会话来跟踪有关用户登录的信息,但是如果用户从foo.com/bar转到foo.com/example,则foo.com/example会看到用户从foo.com/启动的会话并使用该信息。我的问题是,如何同时为每个目录进行两个不同的会话? 问题答案:

  • 问题内容: 有没有办法为特定的浏览器加载不同的CSS文件? 像(伪代码差): 问题答案: 您想要的理想解决方案不存在: 不幸的是,如果您尝试在HTML本身上进行操作,则不存在跨浏览器解决方案。但是,它将适用于大多数版本的IE。像这样: 所以最好的解决方案是: 这样的Javascript解决方案怎么样:浏览器检测。阅读有关此类的内容以更好地弄清该文件的基本作用,就是这样的概念: 显然,它不仅可以检测

  • 我正在使用java-8进行多个Spring boot项目,但现在其中一个需要转移到java-11。所以我需要在笔记本电脑上安装两个版本。那么如何在同一台机器上为不同的项目处理不同的JAVA版本呢?

  • 问题内容: 我想要不同的标签,您可以像在Android Market中一样在其中滑动。每个选项卡应使用一个片段,并使用一种方法。 这是我的FragmentPagerAdapter类: 对于每种片段类型/选项卡,我都有三个类: 每个片段都应该可自定义,这就是为什么我有三个类。 但是,该应用程序在getItem方法中崩溃。有任何想法吗?谢谢! 编辑:完整的MainActivity.java: 问题答案

  • 我有两个网站,例如: foo.example.com bar.example.com 我想发送一些消息之间的网站,如果有打开在不同的标签。 有不同的可能方式: 邮件后传 SharedWorker 本地存储 但每一个都需要相同的来源或对Window.Opener的访问... 如果顶部域相同,则有解决方案浏览器端用于选项卡之间的通信?