繁体   English   中英

在 Java web 应用程序中使用会话的主要用例

[英]Top use cases for using Sessions in Java web application

我一直在努力避免使用 Sessions。 我使用了 spring 安全性或其他让用户登录应用程序的方式,我认为这是使用会话的主要用例。

但是其他用例是什么? 你能列出那些最重要的吗? 为什么我能够在不使用 Sessions 的情况下开发更复杂的应用程序?

是因为我使用的是 spring-mvc 并且除了登录内容之外实际上不需要使用 Sessions 吗?

编辑:伙计们,这个问题是在询问用例......大多数答案都解释了会话的用途。 如果我们总结一些用例,我们可以肯定地说,何时使用数据库或会话来维护会话 state...您不记得您需要会话的任何具体场景吗? 过去几年:)

例如,某些会话 state 可能在某个点/事件之后变得持久。 在这种情况下,我从一开始就使用数据库。

我认为您可以做任何您想做的事情,而无需在会话中存储任何内容。

我通常使用会话来避免在客户端和服务器之间传递 state(以 id 为例)以及当我不想向客户端发送敏感信息(即使是加密形式)时,因为这可能是一个安全问题.

避免使用 session 的其他方法是:

  • 将一些 state 存储在数据库(例如购物车)中,而不是存储在 session 中,即使购物车在一定时间后被丢弃。
  • 将 state 存储在 cookies 中,例如用于用户定制

使用 session 真正有用的一个用例是用于对话,尽管通常框架在幕后管理它,并将对话存储在 session 中。

编辑

转换(在我的理解中)类似于向导,您可以在其中完成不同页面中的几个 forms,最后执行操作。 例如,在结帐过程中,用户在不同的页面中输入他的姓名、送货地址和信用卡详细信息,但您想在最后提交订单,而不在您的数据库中存储任何中间 state。

我的意思是敏感信息,想象在前面的例子中,一旦用户发送了他的信用卡详细信息,你不应该以任何格式(甚至加密)将该信息返回给用户。 我知道这有点偏执,但这就是安全性:)。

在我正在开发的电子商务系统中,后端有一个外部系统,用于存储用户保存的送货和账单地址。 我们的 web 应用程序通过调用 web 服务调用来检索这些地址来与之对话。 当我们得到地址时,我们将它们存储在 session 中。 这样,当用户第一次查看他们的地址时,我们只需要调用一次服务,而不是每次我们提供需要地址信息的页面时。 我们对地址有一个生存时间,所以如果地址发生变化(例如,如果用户致电客户服务台更改地址),我们最终会选择新的。

可以将地址存储在我们的数据库中,而不是 session 中。 但我们为什么要这样做? 它是暂时的信息,已经永久存储在其他地方。 session 是它的理想场所。

好吧,从某种意义上说,您的问题很深(session 有什么特别之处值得了解),而在另一种意义上,它很浅(如果我不使用它们,我不能做什么,结果是一个有点奇怪的问题)

最后,Session 只是(或可能是)一个 ConcurrentHashMap(实际上它通常不是线程安全的),带有一个唯一的 session id 作为 cookie 传递的键。 你知道它为什么有用,但要回答你的用例

  • 集群(这就是 state 跨节点分布的方式)
  • 缓存用户及其对象的一般 state (而不是每次从数据库重新加载)
  • 当有人超时或属性更改时,会话侦听器的内置方法可以监视。 = 被许多本地化实用程序使用

您可以使用数据库或您自己的 hashmap 实现/过滤器来完成所有这些工作吗? 当然,Sessions 并没有什么神奇之处。 它们只是让某些对象跟随登录用户并与该用户使用应用程序的生命周期相关联的方便标准。

为什么要使用 Servlets? 您还可以实现自己的套接字级别标准吗? 答案是使用标准的 apis/implementations 提供了便利,并且其他库建立在它们之上。

缺点是

  • 您正在重新发明轮子和一些经过时间测试的代码
  • 您将无法使用大量内置设施进行监控/管理/集群/本地化等。

会话是跨多个请求(例如多个无状态 HTTP 请求)维护会话 state 的一种方式。

还有其他实现会话 state 的方法,例如,将身份验证令牌或某些合适的会话 id 存储为 cookie 并将会话 id 存储到 session Z9ED39E2EA931586B6A985A6942EF7。 (本质上,复制应用服务器在提供会话时所做的事情。)

您不需要使用会话意味着您的应用程序不需要会话 state 或者您已经以不同的方式实现它。 例如,也许您的应用程序使用身份验证令牌(例如 cookie)并将所有 state 更改保存到数据库。 有了这种安排,就不需要对话 state。

嗨,您可以举一个购物车的例子,因为 Http 是无状态协议,它不会维护发送请求的用户的状态。

例如,如果一个用户从 eBay 发送购买相机的请求,几分钟后另一个用户发送购买笔记本电脑的请求。

但是由于 http 是无状态协议,因此服务器无法分离用户发送的请求,并且可能会发生笔记本电脑的账单可能会给第一个用户。

因此,通过 session,我们可以在服务器端为特定用户维护特定实体。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM