【问题标题】:Opening a password-protected website from servlet从 servlet 打开受密码保护的网站
【发布时间】:2009-06-25 09:36:06
【问题描述】:

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

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

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

在 Java (HttpURLConnection) 中有可能吗?

感谢任何帮助。

谢谢。

【问题讨论】:

    标签: java security networking web password-protection


    【解决方案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 提供这种进入的可能性。

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

    【讨论】:

    • 您好 zim2001,感谢您的回复。看起来这实际上是不可能的,但我见过有人这样做。在这种情况下,Server1 是一个“小插图门户应用程序”,其中可以在其中一个页面中配置 Server2 的 URL 和凭据,然后使用 server2 页面为请求 server1 页面的用户提供服务,而地址栏仍然显示 server1 页面 URL(基本上前锋)。这怎么可能?
    • 我猜这种行为需要完全不同的方法;而不是将客户端转发到 server2,server1 “代理” server2 页面。但是与在 http 协议级别工作的经典代理的巨大区别在于,这里的代理在“html”级别工作。通常,它需要重写 html,这是一种棘手、糟糕且不完整的方法(几年前我在 Sun Portal Server 的“网关”组件中体验过)。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      如果您真的想要实现这种请求转发,内置的 HTTPURLConnection 可能还不够。试试 Apache HTTPClient,它有很多自定义选项。您也可以寻找 TCP 转发解决方案或this post

      【讨论】:

      • TCP 端口转发只起作用,只要转发的内容独立于 TCP 连接上下文。使用 HTTP,这在某些地方会中断:Host-Header 将是错误的,因此源服务器可能会拒绝请求。 HTML 内容中的链接必须是相对的才能继续工作。 HTTPS 不起作用。除此之外,令人惊讶的是,TCP 端口转发器可以轻松模拟简单 Web 应用程序的反向代理。
      猜你喜欢
      • 2013-03-02
      • 2021-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-24
      相关资源
      最近更新 更多