1

该场景旨在用户将访问 servlet(例如http:// someip /myservlet),该 servlet 反过来隐式验证受密码保护的网站(例如mysite.com - 托管在 IIS 服务器上并启用了使用 Windows 身份验证) ,然后打开该网站mysite.com – 这样:

  1. 目标用户不会提示输入用户名和密码,因为他将通过 servlet(托管在某些服务器上,如 tomcat)
  2. 任何其他访问链接文本的用户将无法在不知道凭据的情况下访问

要求是(它必须打开该网站而不是获取内容,因为mysite.com具有动态功能)

在Java(HttpURLConnection)中有可能吗?

任何帮助表示赞赏。

谢谢。

4

3 回答 3

1

您喜欢实现的功能似乎已被HTTP 反向代理覆盖。这种代理会将某些站点 site1.domain1.com “镜像”到另一个位置,例如 site2.domain2.com

最常见的用例是 site1 不是公共的,反向代理将充当网关、负载均衡器、SSL 网关或类似的。

在 Java 中实现:我还推荐Apache HTTP 客户端库。并且可以将 NTLM 身份验证与此客户端库一起使用。

于 2009-06-25T11:39:42.160 回答
1

为了确保我理解您的需求,这里有一个摘要:您希望给定用户 A 连接到您的第一台服务器 Server1.domain1.com,这将连接(从 Java 服务器内部)第二台服务器 server2.domain2.com (目前在 IIS 下)。然后 server1 将用户转发到 server2 网页,挑战是避免任何身份验证弹出窗口。

根本问题是从服务器 1 到客户端浏览器,然后从客户端浏览器到服务器 2,服务器 1 从服务器 2 获得的身份验证票证。

这不是一个具体的 java 问题,而是一个全球性的 WEB 问题。实际上,server2 接收到的唯一用于识别客户端用户的信息是在 http 流中,简而言之就是 IP 地址、URL 和 cookie。

如果 server1 和 server2 不是同一个域(请参阅 RFC 2109: http ://www.ietf.org/rfc/rfc2109.txt),则 Cookie 是死胡同,因为只有在以下情况下,浏览器才会将 cookie 发送到给定域的服务器cookie 是从同一域的服务器(相同或另一个)返回的。

所以答案是一个两步过程:

  • 首先,server1 应该从 server2 获取 sessionID,可能是通过提交具有适当凭据的 http 请求(基本身份验证?表单字段?或更糟糕的是,“Windows 像域身份验证”?)。对于这一步,我建议使用 apache httpclient 库。
  • 其次,server1 应该将客户端用户转发到 server2 的适当 URL,该 URL 将包含 sessionID 作为参数。它要求 server2 提供这种进入的可能性。

乍一看,我看不到其他简单的解决方案。

于 2009-06-25T09:59:04.220 回答
0

如果你真的想实现这种请求转发,内置的 HTTPURLConnection 可能还不够。尝试具有大量自定义选项的 Apache HTTPClient 。您还可以寻找 TCP 转发解决方案或这篇文章

于 2009-06-25T11:44:15.927 回答