我尝试配置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注释或配置获得更好/不同的方法。
答案 0 :(得分:0)
这就是HTTP和浏览器的工作方式:会话标识符通过cookie实现,这些标识符在所有浏览器标签中共享。为了实现此目的,您需要传递唯一的浏览器选项卡标识符以及会话ID cookie。
考虑到您的应用程序可以包含客户端可以控制/命令单击的锚标记链接(或者右键单击并在新选项卡中选择打开链接),这可能很棘手,您需要进行权衡。
执行此操作的一种方法是,如果请求中未指定tab-id参数,则生成tab-id(例如UUID),并确保将其放入所有链接并随应用程序中的所有表单一起提交。 / p>
通过包装HttpServletResponse(使用HttpServletResponseWrapper)并覆盖encodeURL方法,可以影响链接生成。如果您使用的是spring form taglib或thymelef,则可以使用RequestDataValueProcessor向表单添加隐藏的输入。