【问题标题】:REST and HttpSession objectREST 和 HttpSession 对象
【发布时间】:2012-01-31 12:11:11
【问题描述】:

我知道 REST 不应该使用 HttpSession。 另一方面,REST 服务在 servlet 容器中运行。 据我所见,HttpSession 对象只会在以下情况下创建:

HttpSession session = request.getSession(); 

代码被执行。总是这样吗?除了使用JSP?


我的问题是:在执行 REST 方法时是否会创建 HttpSession 对象?

假设我使用 JAX-RS 框架,如果它可以产生任何影响的话。
如果不创建此类对象,则实际上可能意味着服务器内存的大小可能不会增长,无论有多少客户端在服务器上使用它。

【问题讨论】:

    标签: rest servlets jax-rs httpsession


    【解决方案1】:

    我认为这是 Java EE 框架的限制,目前我还没有看到它在任何其他服务器上完成。如果您需要管理容器 security-constraint,将创建一个会话。

    话虽如此,您不需要实现代码即可使用容器管理的身份验证。人们确实实现了身份验证登录/机制,例如 Shiro 等等。

    如果您担心可扩展性,您可能必须自己处理身份验证。但是,在您继续这条道路之前,请考虑以下事项……您希望有多少人使用您的应用程序?除非您是 Facebook 或 Google 等非常大且受欢迎的服务,否则现有的硬件/云产品应该能够通过 HTTP 会话处理您的负载,并且有很大的空闲空间。

    但是,如果您想自己实现它,那么我建议如下:

    1. 未经身份验证的客户端通过凭据(通过WWW-Authorization 是最容易测试的)
    2. 凭证经过验证并返回一个令牌。令牌是一个编码的加密字符串,包含客户端 ID、到期时间和重新认证令牌。此令牌通过Set-Cookie 传递回客户端
    3. 客户端使用包含 tokenCookie 发出未来请求
    4. 令牌只要没有过期就可以使用,这只是服务器节点上的加密计算,因此可以在需要时跨多个服务器扩展,无需处理单个数据存储。
    5. reauth 令牌可用于在客户端过期时为客户端生成一个新令牌(这对于交互可以持续几分钟的用户应用程序很有用)。

    您可以添加企业缓存来存储哪些仍然有效,但需要额外的后端调用。

    【讨论】:

      【解决方案2】:

      HTTP 会话实际上经常与 REST 接口一起使用,但绝不应该包含任何真正关键的内容。因此,它们可用于包含您已通过身份验证的事实或某些列表的首选默认顺序是什么;在前一种情况下,您还可以同时支持其他身份验证机制,允许完全无状态操作,在后一种情况下,您还可以轻松支持显式覆盖。只要您不要求会话——好吧,假设您的站点使用 HTTP BASIC 身份验证是为了争论;如果您使用的是 OAuth,那么您需要启用会话以防止性能下降——那么您仍然可能相当接近 RESTful(在这个领域肯定;REST 不是“不使用会话”)。

      是否担心会话在超时之前持续多长时间?好吧,也许但不是真的。会话实际上是您已映射到某个数据库表中的对象,您可以对它们配置到期策略,以便它们持续足够长的时间以支持有效使用而不会造成过多负担。这取决于有多少客户同时使用该网站,他们的使用模式是什么,以及您有哪些可用的硬件资源(当然)。

      【讨论】:

      • 感谢您的回复。是的会话可以像在那个例子中一样在 REST 中访问: public String mysession(@Context HttpServletRequest req)... 但是如果我根本不创建什么会话对象,我怎么能保证呢?我可以吗?
      猜你喜欢
      • 2011-07-06
      • 2012-09-22
      • 2010-12-10
      • 1970-01-01
      • 2016-06-17
      • 2010-11-18
      • 2011-08-11
      • 2016-03-04
      相关资源
      最近更新 更多