如何为每个浏览器配置Spring 4控制器以进行唯一会话

时间:2014-11-12 21:34:19

标签: java spring session spring-mvc

我尝试配置Spring MVC,以便每个浏览器会话或标签都有自己的会话。可以这样做吗?

来自我的控制器的片段:

@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)) {
    .
    .
    .

用户类是POJO。

' testIntegration'首次访问所有值为空。这是预料之中的。 ' as.authenticateUser(user,sessionTimeout))'设置正确的值。在用户上设置下一个访问值。这是预期和期望的。

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

我看过一个较旧的帖子,表明可以通过在每个表单上放置对话ID来实现对话指示。我希望通过Spring注释或配置获得更好/不同的方法。

1 个答案:

答案 0 :(得分:0)

这就是HTTP和浏览器的工作方式:会话标识符通过cookie实现,这些标识符在所有浏览器标签中共享。为了实现此目的,您需要传递唯一的浏览器选项卡标识符以及会话ID cookie。

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

执行此操作的一种方法是,如果请求中未指定tab-id参数,则生成tab-id(例如UUID),并确保将其放入所有链接并随应用程序中的所有表单一起提交。 / p>

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