从servlet打开受密码保护的网站

时间:2009-06-25 09:36:06

标签: java security networking web password-protection

该方案旨在用户将访问servlet(例如http://someip/myservlet),而servlet依次验证受密码保护的网站(例如mysite.com - 托管在IIS服务器上隐式启用启用Windows身份验证然后打开 mysite.com - 以便:

  1. 目标用户无法获得用户名和提示密码,因为他将通过servlet(托管在像tomcat这样的服务器上)
  2. 访问link text的任何其他用户将无法在不知道凭据的情况下访问
  3. 要求是 (必须打开该网站才能获取内容,因为mysite.com中包含动态功能)

    是否可以在Java(HttpURLConnection)中使用

    感谢任何帮助。

    感谢。

3 个答案:

答案 0 :(得分:1)

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

根本问题是从server1传输到客户端浏览器,然后从客户端浏览器传输到server2,即server1从server2获取的身份验证票证。

它不是特定的java问题,而是更多的全局WEB问题。实际上,server2收到的识别客户端用户的唯一信息是http流,简称IP地址,URL和cookie。

如果server1和server2不是同一个域(参见RFC 2109:http://www.ietf.org/rfc/rfc2109.txt),那么Cookie就是死路一条,因为只有当cookie从服务器返回时,浏览器才会将cookie发送到给定域的服务器(同一个或另一个)SAME域。

所以答案是两个步骤:

  • 首先,server1应该从server2获取sessionID,可能是通过提交具有适当凭据的http请求(basic-auth?form fields?或者最差,“Windows like domain auth”?)。对于此步骤,我建议使用apache httpclient库。
  • 其次,server1应该将客户端用户转发到server2的适当URL,该URL将sessionID作为参数。它要求server2提供进入的可能性。

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

答案 1 :(得分:1)

您希望实施的功能似乎由HTTP reverse proxies涵盖。 这种代理将“镜像”某个站点site1.domain1.com在另一个位置,如site2.domain2.com

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

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

答案 2 :(得分:0)

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