REST和HttpSession对象

REST和HttpSession对象,rest,servlets,jax-rs,httpsession,Rest,Servlets,Jax Rs,Httpsession,我知道REST不应该使用HttpSession。 另一方面,REST服务在servlet容器中运行。 据我所见,只有在以下情况下才会创建HttpSession对象: HttpSession session = request.getSession(); 代码被执行。总是这样吗?除了使用JSP之外 我的问题是:在执行REST方法时是否会创建HttpSession对象 假设我使用JAX-RS框架,如果它能起到任何作用的话。 如果没有创建这样的对象,实际上可能意味着服务器内存的大小可能不会增长,而

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

HttpSession session = request.getSession(); 
代码被执行。总是这样吗?除了使用JSP之外


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

假设我使用JAX-RS框架,如果它能起到任何作用的话。

如果没有创建这样的对象,实际上可能意味着服务器内存的大小可能不会增长,而不管有多少客户机在服务器上使用它。

HTTP会话实际上经常与REST接口一起使用,但不应该包含任何真正重要的内容。因此,它们可以用来包含您已经验证的事实,或者您首选的某些列表的默认顺序是什么;在前一种情况下,您还可以支持其他身份验证机制,同时允许完全无状态操作,在后一种情况下,您还可以轻松地支持显式覆盖。只要你不需要会话——好吧,假设你的站点为了讨论而使用了HTTP基本身份验证;如果您使用的是OAuth,那么您需要启用会话来阻止性能受损——那么您仍然有可能接近RESTful(在这方面是肯定的;REST毕竟不是“不使用会话”)


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

我认为这是Java EE framework目前的局限性,我还没有看到它以其他方式使用任何其他服务器。如果需要管理容器
安全约束
将创建一个会话

也就是说,使用容器管理的身份验证不需要实现代码。人们自己实现身份验证/登录机制,比如Shiro等等

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

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

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

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

    感谢您的回复。可以在REST中访问Yes会话,如该示例中所示:公共字符串mysession(@Context HttpServletRequest req)。。。但如果我根本不知道要创建什么会话对象,我怎么能保证呢?我可以吗?