当前位置: 首页 > 知识库问答 >
问题:

同时使用两个Spring Boot应用程序时注销一个spring应用程序

秋飞鸾
2023-03-14

我有两个spring boot应用程序。

  • 模块1在端口8080上运行
  • 模块2在端口9090上运行

我已在应用程序中使用此属性设置端口。属性文件

server.port=${port:9090}

这两个模块都有/登录/注册,无需通过下面的代码进行身份验证即可访问。

http.authorizeRequests()
            .antMatchers("/signup", "/login").permitAll()

任何其他请求都需要对用户进行身份验证。

如果我一次使用一个模块没有问题,

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

  1. 转到模块1的登录页面-(标头响应已设置jsessionid=XX)ok
  2. 登录模块1-正常
  3. 浏览模块1上的安全内容-正常
  4. 转到module2上的注册页-(标头响应已设置jsessionid=YY)ok
  5. 尝试浏览模块1上的其他安全内容-我必须再次登录

我很确定这是因为模块2重置了jessionid。

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

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

共有2个答案

后阳炎
2023-03-14

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

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

我对同一个主机和不同的上下文路径进行了一些尝试。

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

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

更新

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

  1. 登录到第一个应用程序(端口8084)

因此,即使应用程序在具有相同上下文路径的同一主机的不同端口上运行,它们也使用相同的cookie。基本上,这就是HTTP cookies端口特定吗Cookie不提供端口隔离

一点总结:

  1. 不同的主机:没问题,cookie是不同的
  2. 不同的应用上下文:没问题,cookie是不同的
  3. 相同的主机,相同的应用程序上下文,不同的端口:只有一个cookie,这会导致冲突。

所以食谱和以前一样:

  1. 或者使用不同的主机(即主机名,不包括端口)
端木皓君
2023-03-14

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

有不同的方法来做这些,最简单的一种,对于一个带有版本的Spring启动应用程序

server.session.cookie.name = MYSESSIONID

这篇文章还介绍了其他方法。

 类似资料:
  • 我想在Spring引导管理服务器中注册同一个应用程序的两个实例(只有端口不同)。但是我在我的Spring引导管理面板中只看到一个实例(MyApp实例2)。我的配置有什么问题? 基本信息: Spring Boot管理客户端-2.0.0-SNAPSHOT Spring Boot管理服务器-2.0.0-SNAPSHOT Spring Boot版本(两者)-2.0.1。发布 我的申请书。yml文件:

  • null 这是我第一次尝试将Firebase集成到我的一个项目中,因此一些关于实现这项任务的指导将是非常有用的。 谢了!

  • 我已经设置了一个使用OKTA作为IDP的应用程序。该应用程序基于SAML。这部分工作正常。 但我无法注销。为此,我们有1。已启用单一注销2。设置单一注销URL(我从标题Identity Provider Single Logout URL下的IDP元数据中收到此URL)3。Sp问题(我从标题Identity Provider Issuer下的IDP元数据中收到此消息)4。签名证书(这是IDP的证书

  • 问题内容: 我确信你们中有人注意到,如果您有Acrobat Reader(或其他PDF阅读器),并在Firefox中打开一个PDF,您会看到它嵌入在您的标签中。有什么方法可以将应用程序嵌入JFrame中? 问题答案: 这是一个相当棘手的问题。通常,诸如Adobe Reader之类的本机应用程序不提供可以嵌入到swing应用程序中的组件。但是在Windows中,有COM / OLE方法可以将应用程序

  • 问题内容: 我当前正在开发一个使用JDI连接到已经运行的“目标” java应用程序的“调试器” java应用程序。有什么方法可以让Ant启动目标应用程序,然后在第一个应用程序仍在运行时启动“调试器”? 是的,我知道我可以开发JDI应用程序来启动目标程序,但这不是我现在想要的。 问题答案: 您可以从Ant 并行 任务中生成两个Java程序。 第二个线程中的 睡眠 任务可以由 waitfor 条件替换