request.getRequestURL()在什么条件下返回不是来自我网站的URL?

时间:2016-05-12 03:18:30

标签: http url servlets

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

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

它将这些URL保存在数据库表中。但是,我发现了一些不正常的条目,这些条目不是我网站上网页的URL。例如,如果我的网站的网址如下所示:

http://www.example.com/abc

异常条目如下所示:

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

我们不要谈论这些异常URL的来源。我想知道request.getRequestURL()如何返回其他网站的网址。我过去学到的是request.getRequestURL()返回我网站上请求页面的URL。我想念一下吗?

最佳。

2 个答案:

答案 0 :(得分:2)

听起来这比更重要

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

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

这种方式的工作方式是浏览器在发出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()通过查看基础HTTP请求内容(包括Host标题)来重建浏览器要求的URL。
如果浏览器发送的主机不正确,那么您将在getRequestUrl中看到。

答案 1 :(得分:-2)

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