HttpServletRequest - 如何获取引用URL?

158

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


我理解的是,如果我在谷歌上找到了你的网站并打开了链接,那么你会记录“google.com”? - Roman
4个回答

337

它可以在HTTP referer中找到。你可以在servlet中按照以下方式获取它:

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

然而,您需要意识到这是客户端控制的值,因此可能会被欺骗成完全不同的值甚至被删除。因此,无论它返回什么值,您都不应将其用于后端的任何关键业务流程,而只能用于演示控制(例如隐藏/显示/更改某些纯布局部分)和/或统计数据。

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


2
“referer”和“Referer”有区别吗? - ante.sabo
8
不,标题查找是不区分大小写的。 - BalusC
3
任何标题都可以是“null”。 - rds
@BalusC 如果我需要前两个URL怎么办?这是可能的吗? - Angel Cuenca

28

实际上应该是:request.getHeader("Referer"),或者更好的方法并且保证100%正确的是:request.getHeader(HttpHeaders.REFERER),其中HttpHeaders是com.google.common.net.HttpHeaders


11
从Java EE API文档中获取getHeader(String name)方法的描述(引用):“标头名称不区分大小写。” - informatik01
8
无论如何点赞以获取HttpHeaders参考。Apache HTTP也是一个不错的选择:org.apache.http.HttpHeaders - Barett
org.apache.http.HttpHeaders没有ORIGIN头?而com.google.common.net.HttpHeaders有。 - Loner

17

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

如果你指的是链接到你的其他网站?你想要捕获HTTP Referrer,可以通过调用以下方法实现:

request.getHeader("referer");

7
众所周知,这是
request.getHeader("referer");

我想补充一些关于referer头部的安全方面细节,与接受答案相比。在Open Web Application Security Project (OWASP) 的防范措施中,跨站请求伪造(CSRF)预防防范措施中提到了referer头部的重要性。

对于这个推荐的同源检查来说,更重要的是有一些HTTP请求头不能被JavaScript设置,因为它们在“禁止”头部列表中。只有浏览器本身才能为这些头部设置值,使它们更加可信,因为甚至XSS漏洞也无法修改它们。

这里推荐的源头检查依赖于这三个受保护的头部:Origin、Referer和Host,使其成为一个相当强大的CSRF防御机制。

你可以参考这里的禁止头部列表。用户代理(即浏览器)对这些头部有完全控制,而非用户。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接