【问题标题】:How to configure Spring 4 controller for unique session for each browser如何为每个浏览器配置 Spring 4 控制器以实现唯一会话
【发布时间】:2015-01-09 21:32:29
【问题描述】:

我正在尝试配置 Spring MVC,以便每个浏览器会话或选项卡都有自己的会话。这个可以吗?

来自我的控制器的 sn-p:

@Controller
@Scope("session")
public class TestController {

@Autowired
private AuthenticationService as;

private User user = new User();

@RequestMapping(value="/testIntegration")
public String getIntegration(Model model) {
    logger.debug("user: " + user.toString());

    if(!as.authenticateUser(user, sessionTimeout)) {
    .
    .
    .

User 类是 POJO。

第一次访问“testIntegration”时,所有值都为空。这是意料之中的。 'as.authenticateUser(user, sessionTimeout))' 设置正确的值。在下一个访问值上设置用户。这是意料中的事。

如果打开另一个浏览器窗口并尝试访问“testIntegration”,则会从会话中检索相同的填充用户对象。这不是预期的,也不是所希望的。一个新的浏览器应该获得一个新的会话并且需要一个新的用户对象被创建和填充。

我看到一个较旧的线程表明可以通过在应用程序的每个表单上放置对话 ID 来实现对话指示器。我希望通过 Spring 注释或配置提供更好/不同的方法。

【问题讨论】:

    标签: java spring session spring-mvc


    【解决方案1】:

    这就是 HTTP 和浏览器的工作方式:会话标识符是使用 cookie 实现的,它们在所有浏览器选项卡之间共享。为了得到这个,你需要传递唯一的浏览器标签标识符以及会话 id cookie。

    考虑到您的应用程序可能包含客户端可以控制/命令单击(或右键单击并选择在新选项卡中打开链接)的锚标记链接,这可能很棘手,您需要做出权衡。

    如果在请求中未指定 tab-id 参数,一种方法是生成一个 tab-id(例如 UUID),并确保将其放入所有链接并与应用程序中的所有表单一起提交。

    可以通过包装 HttpServletResponse(使用 HttpServletResponseWrapper)和覆盖 encodeURL 方法来影响链接生成。如果您使用的是 spring forms taglib 或 thymelef,您可以使用 RequestDataValueProcessor 向表单添加隐藏输入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-19
      • 2018-08-17
      • 2011-10-11
      相关资源
      最近更新 更多