【问题标题】:Identity for anonymous user in Spring MVC applicationSpring MVC 应用程序中匿名用户的身份
【发布时间】:2015-09-24 20:14:55
【问题描述】:

我希望能够识别唯一的匿名用户,以便我可以在数据库中为该用户存储一些信息。类似于访客购物车的东西。

我不是特别想使用会话,因为如果我继续使用无会话数据方法进行构建,我喜欢服务器之间的轻松故障转移。

在 Spring Security 或通用 Spring 中是否有任何方法可以获取可用于识别特定匿名用户(主键)的身份令牌?

【问题讨论】:

    标签: spring-mvc spring-security


    【解决方案1】:

    实际上我一般不知道 Spring Security 或 Spring 的替代方法,但为什么你只是从 session.getId() 获取 SessionId

    返回一个字符串,其中包含分配给此的唯一标识符 会议。标识符由 servlet 容器分配,并且是 实现依赖。返回:指定标识符的字符串 分配给此会话

    并将这个 sessionId 保存到 db。这样您就不会在服务器之间失败,您已经将其保存到数据库中。

    【讨论】:

    • 服务器之间的会话ID是否一致?因此,如果我有两台服务器,并且我设置了粘性会话,如果一台服务器出现故障,来自该服务器的访客用户在重定向到其余服务器时是否仍会保持相同的会话 ID?
    • @RichardG 在这种情况下你是对的,Tomcat 会向用户返回不同的 sessionId。
    • 假设您将应用程序部署到多个应用服务器。您现在的期望是,无论用户的请求访问哪个服务器,该请求都必须根据用户的身份得到满足。这意味着,服务器端设置对用户完全透明。这也意味着会话将在所有服务器上复制。如果您没有在会话中明确存储任何内容,那么会话本身就是一个非常小的对象,因此将它放在多台机器上就不是问题了。因此,您应该能够在任何服务器上可靠地使用会话 ID。
    • 所以听起来故障转移来宾帐户的唯一方法是同步集群中的会话数据并依赖会话身份。我曾希望使应用程序无状态,但听起来好像没有一种简单(且安全)的方式来生成匿名用户 cookie——比如 Websphere 的 LTPA 令牌......
    • 我建议你检查 Spring-session -> 这样,你可以将会话范围的对象持久化到缓存/存储层,这意味着你可以避免让应用程序服务器执行会话复制。
    【解决方案2】:

    我已经在 spring security 4 中解决了这个问题。解决方案是 here 只需注入过滤器对应的服务查找用户信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-05
      • 2014-08-09
      • 2012-03-25
      • 2011-06-04
      • 2019-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多