Java 当重定向后域不同时,Apache HttpComponents HttpContext的行为也不同
我制作了一个相当简单的代理来模拟IAM。通过将请求传递给另一台服务器(代理服务器),它的工作非常简单。我正在使用ApacheHTTPComponents。服务器是Tomcat8(顺便说一下,也是代理服务器) 现在我遇到了以下奇怪的行为,我现在无法解释,我真的希望有人能帮助我 委托请求的代码如下所示: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 =
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)时,当代理服务器和代理运行在本地主机以外的域上时,它将失败
测试用例是
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存储、凭据提供程序等