会话变量存储在 java web 应用程序中的位置
Posted
技术标签:
【中文标题】会话变量存储在 java web 应用程序中的位置【英文标题】:Where session variable is stored in java web application 【发布时间】:2014-09-18 15:08:57 【问题描述】:1 - 会话变量存储在 java web 应用程序中的什么位置?在客户端还是服务器端?
2 - 如果我在会话中放置大量对象和变量,它会减慢客户端的请求吗?
P.S 在我的情况下,我使用spring mvc
。
【问题讨论】:
【参考方案1】:“会话”变量由两部分组成,一个非常小的会话标识符,它存储在客户端上,通常命名为jSessionId
,并存储为cookie。但是,sessionId 也可以编码为 URL。
会话的第二部分是实际数据,它存储在服务器上。如果您的服务器是多服务器集群的一部分,则可能在 服务器端 数据库中。每个 session 都由该 sessionId 标识,并且客户端在每个请求中发送它。这就是为什么它被设计成非常小。
【讨论】:
所以如果只有jSessionId
存储在客户端中,为什么我们不将所有变量都作为会话变量而不是请求变量/属性?
@Aminoo 因为请求变量/属性仅对请求有效,所以会话变量在多个请求中有效。两者都在服务器上(第三个服务器“范围”是应用程序)。我推荐 Head First Servlets 和 JSP 以获得更全面的解释。
不,我了解 servlet 和 jsp,我只是问你会话变量是否在客户端存储很少,为什么我们不只使用会话变量而不使用请求变量,我们需要在每次请求时加载它们。
换句话说,只使用会话变量有什么缺点?
@Aminoo 如果您在集群中,会话变量必须被序列化并(通常是)写入数据库。请求变量不是。此外,您在会话中存储的越多,您的应用程序通常就越慢且可扩展性越差。【参考方案2】:
简单的答案是:您的会话数据存储在服务器端。
Web 浏览器将只获得一个字符串 id 来识别它的会话。
其实spring security更关心session信息,因为即使用户不登录,session也可能根本不存在。
当我只使用spring mvc时,我不使用session来存储重要数据,因为session只存储在内存中。它旨在临时保存数据。
当我使用spring security的时候,我必须在内存中保存很多重要的东西,例如无法在互联网上传输的帐户数据,并且我不会每次都从数据库中加载它们。所以我必须选择会话。
因此,当存储登录会话的服务器关闭时,所有已登录该服务器的用户都必须重新登录以获取另一个会话 ID。
Session 并不总是最好的选择,因为当我们有很多服务器使用会话数据时,我必须在所有服务器之间共享数据,无论如何,net IO 对于服务器来说是昂贵的。
【讨论】:
所以如果只有一个字符串 id 存储在客户端,为什么我们不将所有变量作为会话变量而不是请求变量/属性? 服务器端会话变量有很多问题。最大的一个是服务器可扩展性和性能。考虑一下,如果您有许多服务器,并且其中一台出现故障,会发生什么?此服务器中的会话数据将丢失。当然你可以将你的会话数据存储在 db 或 memcached 服务器中,但这意味着所有的会话操作都会触发一个 net IO,这会花费很多。 如果服务器宕机了,我认为我们可以从中检索数据,除非他着火了:-D 不,我怕你拿不到会话数据,因为会话数据只在内存中,当服务器宕机时,你会丢失内存中的所有数据。 @Aminoo 是的,如果您没有特殊配置,会话数据在内存中,因为这是加载数据的最有效方式。这就是为什么许多程序员讨厌服务器端状态。【参考方案3】:1.它存储在服务器上
2.Session存储在服务器上,所以你在其中设置的Object也可能存储在服务器上。请求只向服务器发送一个SessionId来识别这个用户s Session to other users
会话。
【讨论】:
以上是关于会话变量存储在 java web 应用程序中的位置的主要内容,如果未能解决你的问题,请参考以下文章
如何分析 Java/Seam Web 应用程序中的会话内存使用情况?