【问题标题】:In what condition does request.getRequestURL() return a URL not from my website?request.getRequestURL() 在什么情况下返回不是来自我网站的 URL?
【发布时间】:2016-09-07 16:23:45
【问题描述】:

我正在做一个基于 Java 的网站。该网站获取我网站上每个请求页面的 URL:

String url = request.getRequestURL().toString();

它将此类 URL 保存在数据库表中。但是,我发现了一些异常条目,它们不是我网站上某个页面的 URL。例如,如果我的网站的 url 如下所示:

http://www.example.com/abc

异常条目如下所示:

http://www.thedresden.org/
http://www.camptuckerman.org/

先不说这些异常网址是从哪里来的。我想知道request.getRequestURL() 如何返回其他站点的 URL。我过去学到的是 request.getRequestURL() 返回我网站上请求页面的 URL。我错过了什么吗?

最好的。

【问题讨论】:

    标签: http url servlets


    【解决方案1】:

    听起来这是 的问题,而不是 的问题。

    当浏览器连接到网站时,它会告诉网络服务器它正在寻找的网站(主机名)。这就是 1 个网络服务器如何同时处理多个不同站点的内容(“虚拟主机”)

    例如示例公司可能有一个美国网站example.com 和一个英国网站example.co.uk。它们可以由同一网络服务器托管,但显示不同的内容。

    其工作方式是浏览器在发出 HTTP 请求时包含一个“Host”标头。这样,网络服务器就知道将哪些内容返回给客户端。因此,例如,当我加载 stackoverflow.com 时,我的浏览器会包含一个

    的标题
    Host: stackoverflow.com
    

    如果您在浏览器的开发人员工具中查看“网络”选项卡,您可以看到该标题(具体细节因浏览器而异)。

    从技术上讲,此过程中的任何内容都不需要客户端(浏览器)对网络服务器诚实

    所以,我可以这样做:

    curl 'http://stackoverflow.com' -H 'Host: example.com'
    

    它从“stackoverflow.com”的网络服务器请求一个页面,但告诉网络服务器我想要“example.com”的内容。
    在这种情况下,因为 stackoverflow.com 是由 cloudflare 提供的,所以我得到一个 cloudflare 错误页面。

    似乎出于某种原因,某些“浏览器”(或者很可能是机器人)正在访问您的网络服务器并请求其他域上的页面(例如 www.camptuckerman.org)。
    HttpServletRequest.getRequestUrl() 重构浏览器的 URL通过查看底层 HTTP 请求内容(包括 Host 标头)来请求。
    如果浏览器发送了错误的主机,那么您将在getRequestUrl 中看到。

    【讨论】:

    • 蒂姆,非常感谢您的回答。我在 Chrome 和 Firefox 中输入了http://www.example.com -H http://www.abcdefg.com,我的网站没有被调用,也没有看到来自外部的任何网站请求。你是说机器人、curl 或其他一些工具能够构造“坏”标题,因此我的网站会产生异常的 URL?
    • 我也在 Windows 上尝试了 curl http://example.com' -H 'Host: example.com(当然将 example 替换为实际域名)。我的网站没有收到任何网络请求。我如何测试您在 Windows 上所说的内容?谢谢!
    • 对不起,我不是普通的 Windows 用户,所以我无法为您提供帮助。我相信 Firefox 的 LiveHttpHeaders 插件允许您使用更改的标头重播请求,因此这可能是一种选择。
    • 我会试试的。非常感谢您的信息!
    【解决方案2】:

    我认为 URL 转发正在您的 servlet 中与您的请求一起发生,因此 request.getRequestURL() 正在返回其他站点。

    【讨论】:

    • alim,感谢您的意见。正如你解释的那样,我很难理解它是如何发生的。能否请您展示一些我可以用来编程来测试它的步骤?
    猜你喜欢
    • 2015-06-10
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 2017-03-25
    相关资源
    最近更新 更多