对于真正的无状态服务器端,跨服务器跟踪用户非常棘手。在大多数情况下,事情都是无状态服务器,其中登录例外。但是,无状态服务器的重要之处在于它使群集非常简单,因此您可以水平扩展。
在Java中,您可以使用cookie来存储凭据,也可以使用分布式哈希将其设置为无状态。通常,人们接受使用像memcache之类的东西,并说他们是无状态的,因为状态存储在Web服务器外部。这使用户可以使用服务器场中的任何Web服务器,并且仍然可以安全地进行身份验证。在Java中,我们有很多可与spring一起使用的分布式哈希实现,因此您不必使用memcache来执行此操作。
另一种选择是使用cookie来存储称为HMAC的加密安全散列票证。使用cookie避免使用Session,因此Web服务器是无状态的。使用HMAC,您可以签名不能由第三方伪造或创建的数据块,并且可以保证数据源于您。这不需要外部服务器资源(缓存)来对用户进行身份验证,因此可以更好地进行扩展,但是您需要注意一些安全问题。仅供参考,Google使用此技术水平缩放。一个HMAC不同于SHA1或其他Cyrpto哈希。他们需要一个密钥,该密钥必须位于服务器场中的每个服务器上。还必须使用对称加密密钥进行保护,以确保在有人获取文件的情况下将其安全地存储在服务器上。HMAC信息也以明文形式存储,因此当您可以将用户名或电子邮件放入cookie时,任何人都可以使用实际的加密哈希。如果有人要保留该cookie,则可以伪装成该用户。这就是为什么HMAC通常仅在一定时间内有效的原因。此后,它们就会过期,因此,如果有人找到了他们,他们将永远无法访问该帐户。
因此,HMAC具有此弱点,因此您应注意在其中使用哪些应用程序。使用PayPal方案对于Paypal来说确实是个坏主意,因为我要做的就是获取安全的cookie,然后将所有资金转给我。最大的好处是,所有事情都是您的应用程序真正无状态的。
最后一个选择是将Java会话存储在分布式哈希中。php和其他平台会将其会话转储到数据库中,穷人则将其分发到缓存中,或者将其转储到内存缓存中。使用Java,您可以做同样的事情。您也可以将会话对象放入分布式缓存中。由于人们认为“很酷,现在我可以将我想要的任何内容转储到我的会话中,这将是无状态的”,因此该选项已不受欢迎。但是,与所有分布式缓存一样,链接速度,复制时间和有效负载大小也受到限制。Java或Memcache都是如此。保持较小的会话,这很好用。将所有内容投入会话中,您就可以直接解决单个服务器遇到的扩展问题。真的是
更新:以下是可用于执行此操作的Java分布式缓存库的列表:
http://www.manageability.org/blog/stuff/distributed-cache-
java



