HttpServletRequest-如何获取引用URL?


144

我需要在Java Servlet中记录链接到我的网站的URL。


我是否正确理解您的意思,如果我在google中找到了您的网站并打开了链接,那么您登录了“ google.com”?
罗马2010年

Answers:


310

HTTP referer标头中可用。您可以按如下所示在servlet中获取它:

String referrer = request.getHeader("referer"); // Yes, with the legendary misspelling.

但是,您需要意识到这是一个由客户控制的值,因此可以被欺骗为完全不同的东西甚至被删除。因此,无论返回什么值,您都不应将其用于后端中的任何关键业务流程,而应仅用于表示控制(例如,隐藏/显示/更改某些纯布局部分)和/或统计信息。

有兴趣的人可以在Wikipedia中找到有关拼写错误的背景。


2
“ referer”和“ Referer”有什么区别吗?
ante.sabo 2012年

7
@ante:不,标头查找不区分大小写。
BalusC

2
请注意,任何标头都可以是null
rds 2016年

@BalusC如果我需要前两个网址怎么办?有可能的 ?
Angel Cuenca

26

实际上,它是: request.getHeader("Referer"),甚至更好,并且可以100%确定, request.getHeader(HttpHeaders.REFERER)HttpHeaders在哪里com.google.common.net.HttpHeaders


11
从Java EE API文档中获取该方法getHeader(String name)(引用):"The header name is case insensitive."
informatik01,

7
无论如何还是要投票支持HttpHeaders参考。Apache HTTP是另一个好方法:org.apache.http.HttpHeaders
Barett

16

URL在请求中传递: request.getRequestURL()

如果您是指其他链接到您的网站?您想要捕获HTTP Referrer,可以通过调用以下命令来完成:

request.getHeader("referer");

6

所有人都提到过

request.getHeader("referer");

与接受的答案相比,我想添加更多有关引荐标头安全性方面的细节。在“开放式Web应用程序安全性项目(OWASP)”备忘单中,“ 跨站点请求伪造(CSRF)预防备忘单”下提到了引荐标头的重要性。

对于此推荐的Same Origin检查更重要的是,JavaScript无法设置许多HTTP请求标头,因为它们在“禁止”标头列表中。只有浏览器本身可以为这些标头设置值,从而使它们更值得信赖,因为甚至XSS漏洞都不能用来修改它们。

此处推荐的Source Origin检查依赖于以下三个受保护的标头:Origin,Referer和Host,这使其自身具有相当强大的CSRF防御能力。

您可以在此处参考“ 禁止的标题列表”。用户代理(即:浏览器)拥有对这些标头而不是用户的完全控制权。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.