Java 当重定向后域不同时,Apache HttpComponents HttpContext的行为也不同

Java 当重定向后域不同时,Apache HttpComponents HttpContext的行为也不同,java,redirect,tomcat8,http-redirect,apache-httpcomponents,Java,Redirect,Tomcat8,Http Redirect,Apache Httpcomponents,我制作了一个相当简单的代理来模拟IAM。通过将请求传递给另一台服务器(代理服务器),它的工作非常简单。我正在使用ApacheHTTPComponents。服务器是Tomcat8(顺便说一下,也是代理服务器) 现在我遇到了以下奇怪的行为,我现在无法解释,我真的希望有人能帮助我 委托请求的代码如下所示: BasicHttpContext context = getSessionToken(request); dumpContext("before", context); httpResponse =

我制作了一个相当简单的代理来模拟IAM。通过将请求传递给另一台服务器(代理服务器),它的工作非常简单。我正在使用ApacheHTTPComponents。服务器是Tomcat8(顺便说一下,也是代理服务器)

现在我遇到了以下奇怪的行为,我现在无法解释,我真的希望有人能帮助我

委托请求的代码如下所示:

BasicHttpContext context = getSessionToken(request);
dumpContext("before", context);
httpResponse = httpClient.execute(httpRequest, context);
dumpContext("after", context);
getSessionToken(请求)从会话中获取上下文,或者创建一个新的上下文并将其分配给会话,以便可以在同一会话中的每个请求中传递上下文

当请求被委托到与代理相同的域时,一切都正常,但一旦域不同,会话就会丢失。JSESSIONID没有传递(尽管我确实在cookie存储中看到了sessionid)

当第一次调用之后是重定向时,就会出现这种情况

我对上下文进行了转储,以防域是相同的,当它们不同时

域是相同的

accept-language: nl-NL,nl;q=0.8,en-US;q=0.6,en;q=0.4 
accept-encoding: gzip, deflate, sdch, br, 
accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8,  
http.cookie-spec=default, 
http.cookie-store=[[version: 0][name: JSESSIONID][value: AD4D19BB86D3333149A92A437A676D59][domain: localhost]  
[path: /ipAbnAmroContract][expiry: null]] 
http.target_host=http://localhost:8080,   
http.route={}->http://localhost:8080,   
http.cookie-origin=[localhost:8080/ipAbnAmroContract/],   
http.response=HttpResponseProxy{HTTP/1.1 303 See Other 
[Set-Cookie: JSESSIONID=AD4D19BB86D3333149A92A437A676D59; Path=/ipAbnAmroContract; HttpOnly, 
域不同

accept-language: en-US,en;q=0.5,                     
accept-encoding: gzip, deflate,           
accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8,             
http.cookie-spec=default, http.cookie-store=[[version: 0][name: JSESSIONID][value: 87FD6DC8E528348DDA0A276D840C3070][domain: proxyserver]
[path: /ipAbnAmroContract][expiry: null]] 
http.target_host=http://proxyserver:8080, 
http.route={}->http://proxyserver:8080, 
http.cookie-origin=[proxyserver:8080/ipAbnAmroContract/], 
http.response=HttpResponseProxy{HTTP/1.1 303 See Other 
[Set-Cookie: JSESSIONID=87FD6DC8E528348DDA0A276D840C3070; Path=/ipAbnAmroContract; HttpOnly
简言之:当代理服务器在直接重定向后发送会话id(JSSessionID)时,当代理服务器和代理运行在本地主机以外的域上时,它将失败

测试用例是

  • 代理和代理服务器都在本地主机上运行 有效

  • 代理服务器未在本地域上运行 失败

  • 代理和服务器都不在本地域上运行 失败

  • 代理不运行localhost,代理服务器运行localhost 有效

  • 没有初始重定向 适用于上述所有用例

  • 同步对上下文的访问(谢谢oleg) 对结果没有影响

  • accept-language: nl-NL,nl;q=0.8,en-US;q=0.6,en;q=0.4 
    accept-encoding: gzip, deflate, sdch, br, 
    accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8,  
    http.cookie-spec=default, 
    http.cookie-store=[[version: 0][name: JSESSIONID][value: AD4D19BB86D3333149A92A437A676D59][domain: localhost]  
    [path: /ipAbnAmroContract][expiry: null]] 
    http.target_host=http://localhost:8080,   
    http.route={}->http://localhost:8080,   
    http.cookie-origin=[localhost:8080/ipAbnAmroContract/],   
    http.response=HttpResponseProxy{HTTP/1.1 303 See Other 
    [Set-Cookie: JSESSIONID=AD4D19BB86D3333149A92A437A676D59; Path=/ipAbnAmroContract; HttpOnly, 
    

    非常感谢您的帮助。

    HttpContext实例是否由多个线程同时访问?不太确定,但很可能是这样。如果这可能是一个问题,那么我不理解为什么它在没有重定向的情况下工作,假设在这种情况下,相同的上下文也被多个线程访问。必须通过同步对令牌的访问来测试您的想法,该令牌实际上可以更改。它不能解决问题。@oleg只有在从服务器直接重定向后才会出现问题。当我在“localhost”域中运行它时,它就会工作,只有当代理服务器不位于localhost时才会失败。(1)同步访问HttpContext实例是不够的。HttpContext不能由多个线程共享。但是,多个HttpContext实例可能共享线程安全属性,如身份验证缓存、cookie存储、凭据提供程序等