Cookies 同时使用两个spring启动应用程序时注销一个spring应用程序

Cookies 同时使用两个spring启动应用程序时注销一个spring应用程序,cookies,spring-boot,spring-security,port,jsessionid,Cookies,Spring Boot,Spring Security,Port,Jsessionid,我有两个spring启动应用程序 模块1在端口8080上运行 模块2在端口9090上运行 我已在application.properties文件中使用此属性设置端口 server.port=${port:9090} 这两个模块都有/login、/signup,可以通过下面的代码进行访问,而无需验证 http.authorizeRequests() .antMatchers("/signup", "/login").permitAll() 任何其他请求都要求对用户进

我有两个spring启动应用程序

  • 模块1在端口8080上运行
  • 模块2在端口9090上运行
我已在application.properties文件中使用此属性设置端口

server.port=${port:9090}
这两个模块都有/login、/signup,可以通过下面的代码进行访问,而无需验证

http.authorizeRequests()
            .antMatchers("/signup", "/login").permitAll()
任何其他请求都要求对用户进行身份验证

如果我一次使用一个模块,就不会有问题

但是,如果试图在同一时间来回使用它们,那么问题是每次使用另一个应用程序时,我都必须再次登录到上一个应用程序。 例如

  • 转到模块1的登录页面-(标头响应已设置jsessionid=XX)ok
  • 登录模块1-确定
  • 浏览模块1上的安全内容-确定
  • 转到模块2上的注册页-(标头响应已设置jsessionid=YY)ok
  • 尝试浏览模块1上的其他安全内容-我必须再次登录
  • 我很确定这是由于模块2重置了jessionid

    我读过这篇文章,其中指出cookie不是特定于端口的


    但必须有一个解决方案,这样我就不必每次切换应用程序时都登录。

    您需要为这两个应用程序使用不同的cookie名称

    有不同的方法可以实现这些,对于版本>=1.3的spring引导应用程序,最简单的方法就是设置一个属性:

    server.session.cookie.name = MYSESSIONID
    

    其他方法在本文中有所描述。

    将您的应用程序映射到不同的上下文路径,因此
    JSESSIONID
    cookies将是独立的;否则,cookie用于相同的上下文,因此两个应用程序实际上只有一个cookie。另一个解决方案是使用不同的主机

    请注意,在这里您不仅要更改cookie的上下文路径:若您更改应用程序的上下文路径,Servlet API实现将为您处理cookie上下文路径的更改

    我已经尝试过使用相同的主机和不同的上下文路径

    我目前正在启动两个应用程序,它们都以ServletAPI为基础(JSessionIDCookie由ServletAPI的会话机制定义)。这两个应用程序都在本地主机、不同端口和不同上下文(/app1和/app2)上运行。我已经登录了这两个应用程序,在Chrome列出cookies的对话框中,我可以看到两个JSESSIONID cookies:一个用于
    localhost
    /app1
    ,另一个用于
    localhost
    /app2

    然后我在/app2中注销。它的JSESSIONID被销毁并用不同的内容重新创建(因为我再次被重定向到登录页面)。(请注意,要查看该更改,我必须关闭Cookies对话框并重新打开它,因为Chrome没有动态更新它)。同时,属于/app1的JSESSIONID cookie是完整的,我可以继续在/app1中工作(因此我没有从中注销)

    更新

    再做一次实验。我已在同一上下文(/app1)中映射了这两个应用程序。它们在localhost:8084和localhost:8085上运行。我做了以下工作:

  • 我登录到第一个应用程序(端口8084)
  • 我登录到第二个应用程序(端口8085)
  • 我切换回第一个应用程序选项卡,单击任意链接,看到会话被破坏(因为我被重定向到登录页面)
  • 因此,即使应用程序在具有相同上下文路径的同一主机的不同端口上运行,它们也使用相同的cookie。基本上,这就是中所说的:Cookies不提供端口隔离

    小结:

  • 不同的主机:没问题,cookies是不同的
  • 不同的应用程序上下文:没问题,cookies是不同的
  • 相同的主机、相同的应用程序上下文、不同的端口:只有一个cookie,这会导致冲突
  • 因此,配方与之前相同:

  • 或者使用不同的主机(即主机名,不包括端口)
  • 或者使用不同的上下文路径
  • 或者(如另一个答案所示)更改cookie名称以避免冲突

  • 将您的应用程序映射到不同的上下文路径,因此JSESSIONID cookies将是独立的;否则,cookie用于相同的上下文,因此两个应用程序实际上只有一个cookie。另一个解决方案是使用不同的主机。@dur它的localhost:8080/和localhost:9090/@RomanPuchkovskiy使用不同的上下文路径真的能解决问题吗?因为在我发布的链接中,它说cookie是在域级别(即localhost)上指定的,cookie绑定到主机+上下文路径对,所以如果上下文对不同(并且每个应用程序正确设置了cookie路径),那么这将是两个不同的独立cookie,即使主机是相同的。@Roman我已经将Stefan的答案标记为正确答案,因为它解决了问题。这不意味着localhost:8080和localhost:9090是两个不同的主机吗?创建两个不同的上下文路径?@dur,你说得对,更改cookie路径也是一个选项