繁体   English   中英

Servlet充当代理:如何转发会话?

[英]Servlet Acting as Proxy: How to forward the session?

我不太确定我要实现的要求的可行性,但是这是如何进行的:

  • 我创建了一个充当代理的Servlet。 它收到一个RESTful调用,然后在远程服务器(节点)上调用另一个RESTful服务。
  • 转发是通过HTTPClient实现的,而不是通过Request Dispatcher实现的。 我基本上是向远程服务器发出新的HTTP请求。
  • 当第一个服务器(代理服务器)接收到呼叫时,请求( HttpServletRequest )具有与其相关联的会话。 HTTPSessionisNew()属性为false。
  • 当呼叫转移并且远程服务器接收到呼叫时,会话将成为一个全新的会话。

我试图从根本上找到一种将会话转发到远程服务器的方法。

更精确地说: 是否可以简单地从HttpServletRequest获取会话并将其放入新创建的HTTP请求的会话中(通过HTTPClient )?

这取决于您的远程WS如何维护会话。 例如,如果它使用cookie(Tomcat会在其他技术中做到这一点),则转发传入的标头应该可以帮助您实现这一点(请确保您提到接受cookie,但我默认HTTPClient会这样做)。 现在,如果它基于URL中的参数,那么您应该尝试重现该行为。

如果两个节点(代理节点和服务节点)是不属于应用程序集群的单独进程,则可能不是。

Servlet容器通常管理HttpSession。 如果将请求转发到由另一个容器托管的另一个服务,则将具有另一个会话对象。

如果两个节点是群集的一部分,那么通常可以通过多种机制(在内存复制,数据库同步等中)在群集中的节点之间共享会话。

另一个选择是将会话数据外部化为Redis,Memcached,Coherence等。某些应用程序服务器对此过程具有可插拔的支持。 我相信在这种情况下,应用程序服务器节点不一定必须是集群的成员才能共享会话数据。

当我问这个问题时,我缺乏会话处理的一些基础知识。 经过一番研究和讨论之后,我得到了:

  • 基本上,会话由JSESSIONID变量处理。
  • 当请求到达服务器时,将自动创建JSESSIONID (可以将其关闭)。
  • 它通过响应头发送回。
  • 远程服务器认为这是一个新会话的原因是因为请求没有设置此JSESSIONID

  • 代理执行以下操作以确保转发会话:

    1. 当传入请求进入时; 创建并存储JSESSIONID
    2. 向远程服务器发出新请求。
    3. 从远程服务器解压缩响应头,然后提取JSESSIONID
    4. 维护客户端JSESSIONID和远程服务器JSESSIONID的映射。
    5. 对于以下任何请求,请使用此映射将请求发送到远程服务器。

基本上,代理会执行从客户端的JSESSIONID到远程服务器的JSESSIONID的映射。 这样,会话将转发到远程服务器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM