我正在做一个基于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。我想念一下吗?
最佳。
答案 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()将返回其他站点。