在同一服务器上运行的不同GWT应用程序从同一浏览器中相互干扰

在同一服务器上运行的不同GWT应用程序从同一浏览器中相互干扰,gwt,browser,rpc,gwt-rpc,gwt2,Gwt,Browser,Rpc,Gwt Rpc,Gwt2,我在Jetty上有一个GWT应用程序。在配置不同的访问端口等之后,用户可以在同一台服务器上多次(例如2次)启动此应用程序。我们注意到,当从同一个浏览器访问这两个不同的实例时,它们相互干扰,例如,一个将另一个会话踢出 如果从不同的浏览器访问,例如ie和firefox或chrome,则没有问题 当然,如果两个应用程序在不同的服务器上运行,则没有问题 以前有人见过同样的行为吗?如何解决此问题?如果您的服务器使用cookie来维护会话,并且两个浏览器实例共享同一组cookie,那么当第二个实例登录时,它

我在Jetty上有一个GWT应用程序。在配置不同的访问端口等之后,用户可以在同一台服务器上多次(例如2次)启动此应用程序。我们注意到,当从同一个浏览器访问这两个不同的实例时,它们相互干扰,例如,一个将另一个会话踢出

如果从不同的浏览器访问,例如ie和firefox或chrome,则没有问题

当然,如果两个应用程序在不同的服务器上运行,则没有问题


以前有人见过同样的行为吗?如何解决此问题?

如果您的服务器使用cookie来维护会话,并且两个浏览器实例共享同一组cookie,那么当第二个实例登录时,它必须将第一个实例踢出-同一个cookie怎么可能有多个值

要尝试的选项:

  • 不要使用cookies跟踪会话
  • 不需要第二个选项卡/窗口登录,但要认识到它已登录
  • 不支持同一用户同时冒充两个用户

JSESSIONID用于防止跨站点请求伪造攻击。检查您如何设置此cookie。通常,您会将其设置为:

<script type="text/javascript">
    var info = "<%=XsrfTokenUtil.getToken(request.getSession().getId()) %>";
</script>

将false替换为true以允许重复cookie。

什么是“踢出其他会话”?当user1登录到第一个实例时,user2登录到第二个实例后,user1会话将注销到登录页面。我刚刚发现我的问题与您使用的身份验证几乎相同?一个会话不会杀死另一个会话,除非您在代码中的某个地方故意这么做;到instance2的第二个连接将有一个同名但值不同的cookie。从浏览器的角度来看,它将清除前面的cookie,并从本质上注销第一个cookie。我不知道如何控制cookie名称。可能吗?如果更改名称,所有RPC调用都将失败。XsrfTokenServiceUtil出于安全目的使用此cookie。如果它们访问同一个cookie,则两个会话都应正常工作-即,您提到的第二个选项应正常工作。对,但显然这不起作用,否则我们将不会阅读此问题;)。每个不同的登录都有不同的会话信息。从浏览器的角度来看,它跟踪使用cookie登录的会话名为“JSESSIONID”,第二次登录会清除第一个cookie。第二个和第三个都不适用于我们,无论是谁登录,浏览器都会获得相同的cookie名称“JSESSIONID”,并且它总是会从何处和任何人处清除前一个cookie名称。我不知道是否有解决方法。在GWT中,JSESSIONID通常用于安全,而不是登录。对于登录,您可以使用您想要的任何名称设置不同的cookie。登录是“安全”的一部分,使用浏览器自己的身份验证/授权详细信息信任浏览器意味着客户端可以将cookie更改为其他人,或者客户端必须向服务器传递第二个令牌,当服务器可以将其保存在映射到JSESSIONID的会话对象中时。跟踪第二个cookie仍然会有最初的问题,如果第二个页面再次碰撞它。对于标记,我们的impl使用纯GWT,而不是直接创建html页面。对于“final Cookie sessioncokie=getCookie(cookies,“JSESSIONID”,false)”,您提到了XsrfTokenUtil。你的意思是我得去图书馆吗?或者有什么地方我可以设置它?纯GWT仍然需要一个HTML页面,它可以是简单的HTML或由JSP生成。GWT将生成的任何内容附加到此页面。
final Cookie sessionCookie = getCookie(cookies, "JSESSIONID", false);