我做了一个非常简单的代理来模拟IAM。通过将请求传递给另一个服务器(代理服务器),它非常简单。我正在使用apache HttpComponents。服务器是TOMCAT 8(顺便说一句代理)。
现在我遇到了以下奇怪的行为,我现在无法解释,我希望有人可以帮助我。
委托请求的代码如下所示:
BasicHttpContext context = getSessionToken(request);
dumpContext("before", context);
httpResponse = httpClient.execute(httpRequest, context);
dumpContext("after", context);
getSessionToken(request)从会话中获取上下文,或者创建一个新的上下文并将其分配给会话,以便它可以与同一会话中的每个请求一起传递。
当请求被委托给与代理相同的域时,一切正常,但只要域不同,会话就会丢失。 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(JSESSIONID)时,当代理服务器和代理在域其他上运行时,它会失败>而不是 localhost
测试用例
代理和代理服务器都在localhost上运行 的工作原理
代理服务器不在本地域上运行 的失败
代理和服务器都不在本地域上运行 的失败
代理不运行localhost,代理服务器执行 的工作原理
没有初始重定向 适用于上述所有用例
同步访问上下文(谢谢oleg) 对结果没有影响
感谢任何帮助。