当前位置: 首页 > 面试题库 >

同一IP地址但不同端口上的两台服务器之间的JSESSIONID冲突

江恩
2023-03-14
问题内容

我遇到的情况是,我在同一台服务器上使用不同的端口运行两个不同的Web应用程序。它们都在运行Java的Jetty
servlet容器,因此它们都使用名为JSESSIONID的cookie参数来跟踪会话ID。这两个Web应用程序正在争用会话ID。

  • 打开Firefox标签,然后转到WebApp1
  • WebApp1的HTTP响应具有带有JSESSIONID = 1的set-cookie标头
  • Firefox现在在对WebApp1的所有HTTP请求中都有一个JSESSIONID = 1的Cookie头
  • 打开第二个Firefox选项卡,然后转到WebApp2
  • WebApp2的HTTP请求也有一个JSESSIONID = 1的Cookie头,但是在doGet中,当我调用req.getSession(false);get时null。如果我打电话给req.getSession(true)我一个新的Session对象,但是WebApp2的HTTP响应中有一个set-cookie头,其JSESSIONID = 20
  • 现在,WebApp2具有正常工作的会话,但WebApp1的会话已消失。转到WebApp1将给我一个新的会话,使WebApp2的会话中断。
  • 永远继续

因此,每个Web应用程序之间的Session都会发生混乱。req.getSession(false)如果已经定义了JSESSIONID
cookie,我真的很想返回一个有效的会话。

一种选择是基本上使用HashMap和称为WEBAPP1SESSIONID和WEBAPP2SESSIONID的cookie重新实现Session框架,但这很糟糕,这意味着我将不得不将新的Session内容侵入ActionServlet和其他一些地方。

这一定是其他人遇到的问题。码头HttpServletRequest.getSession(boolean)只是cr脚吗?


问题答案:

我有一个类似的问题:在应用程序启动时选择的本地主机上不同端口上的同一应用程序的一个或多个实例,每个实例都使用自己的码头实例。

一段时间后,我想到了这个:

  • 等待码头初始化
  • 使用码头的SocketManager获取端口(socketManager.getLocalPort()
  • 通过SessionManager设置cookie名称(sessionHandler.getSessionManager().setSessionCookie(String)

这样,我为每个实例使用不同的Cookie名称-因此不再受到干扰。



 类似资料:
  • 我有三个tomcat容器运行在不同的网桥网络与不同的子网和网关例如: 这些容器在不同的端口上运行,如8081, 8082, 8083 有没有办法在同一个8081中运行所有三个容器?如果可能的话,我怎么能在docker做呢。

  • 让我们假设一个后端应用程序,它公开了一些Rest API,运行在地址192.168.1.10:8889的Jetty网络服务器上。 我希望有一个前端应用程序(仅限于html/javascript,在apache2 Web服务器上)在相同的IP上运行,但在不同的端口(例如8000)上运行,它应该使用后端应用程序公开的API。 我怎样才能让这个架构工作而不进入“No'Access-Control-All

  • 我有一个装了Ubuntu系统的服务器带有两个网口eth0和eth1。eth0的IP是192.168.2.178/24, eth1的IP是192.168.2.179。 通过netplan配置网络,内容如下: 当我完成这个网络配置后,系统的路由表中会自动添加两条路由,如下所示: Destination Gateway Genmask Flags Metric Ref Use Iface 192.168

  • 我想部署一个tomcat服务器,以便它同时侦听两个端口(都用于超文本传输协议)。 为了确保您正确理解这个需求,我们只有一个服务器实例,但希望侦听HTTP协议的两个端口。例如,任何人都可以使用端口号7080和8080访问部署在我的服务器中的应用程序 有可能做到吗?如果可能,我们如何实现这一点?

  • 我有一个监听两个不同端口的TCP服务器。我创建了两个不同的套接字,一个在端口8888上,一个在端口6634上。我监听这些端口,然后我在FD_SET中添加两个套接字,并将它们传递给Select()函数...当套接字准备好读取时,我检查FD_ISSET,看看哪个端口上有消息要读取。 不管怎样,当我连接到8888端口时,构思是成功的,我可以向服务器发送和接收。。。当我在客户端ctrl c时,选择函数再次

  • 我在生产服务器上安装SSL时遇到问题。我在端口80上运行Laravel,在端口8080上运行vue js。我已经安装了SSL证书。 但是现在当我试图发送任何请求到8000a时有一个错误: XHR.js:178混合内容:“HTTPS://www.example.com/login”页面是通过HTTPS加载的,但请求的XMLHttpRequestendpoint“http://www.example.