HttpServletRequest - 如何获取引用 URL?
Posted
技术标签:
【中文标题】HttpServletRequest - 如何获取引用 URL?【英文标题】:HttpServletRequest - how to obtain the referring URL? 【发布时间】:2011-02-08 14:10:26 【问题描述】:我需要在 Java Servlet 中记录链接到我的网站的 URL。
【问题讨论】:
我是否理解正确,如果我在 google 中找到了您的网站并打开了链接,那么您登录了“google.com”? 【参考方案1】:在HTTP referer
header 中提供。您可以按如下方式在 servlet 中获取它:
String referrer = request.getHeader("referer"); // Yes, with the legendary misspelling.
但是,您需要意识到这是一个客户端控制的值,因此可能会被完全不同的东西所欺骗,甚至被删除。因此,无论它返回什么值,您都不应该将它用于后端的任何关键业务流程,而只能用于表示控制(例如隐藏/显示/更改某些纯布局部分)和/或统计信息。
有兴趣的可以在Wikipedia找到有关拼写错误的背景。
【讨论】:
“推荐人”和“推荐人”有区别吗? @ante: 不,标头查找不区分大小写。 注意任何header都可以是null
。
@BalusC 如果我需要前两个网址怎么办?有可能吗?【参考方案2】:
URL 在请求中传递:request.getRequestURL()
。
如果您指的是链接到您的其他网站?您想捕获 HTTP Referrer,您可以通过调用来完成:
request.getHeader("referer");
【讨论】:
【参考方案3】:其实是:
request.getHeader("Referer")
,
甚至更好,而且可以 100% 确定,
request.getHeader(HttpHeaders.REFERER)
,
其中 HttpHeaders 是 com.google.common.net.HttpHeaders
【讨论】:
来自方法getHeader(String name)
的 Java EE API 文档(引用):"The header name is case insensitive."
无论如何都支持 HttpHeaders 参考。 Apache HTTP 是另一个不错的选择:org.apache.http.HttpHeaders
【参考方案4】:
正如大家所说的那样
request.getHeader("referer");
我想添加更多关于 referer 标头的安全方面的详细信息,与接受的答案相比。在 Open Web Application Security Project(OWASP) 备忘单中,Cross-Site Request Forgery (CSRF) Prevention Cheat Sheet 下提到了 referer 标头的重要性。
更重要的是,对于推荐的同源检查,javascript 无法设置许多 HTTP 请求标头,因为它们位于“禁止”标头列表中。只有浏览器自己才能为这些标头设置值,使它们更值得信赖,因为即使是 XSS 漏洞也不能用来修改它们。
此处推荐的 Source Origin 检查依赖于其中三个 受保护的标头:Origin、Referer 和 Host,使其非常漂亮 强大的 CSRF 防御全靠自己。
您可以参考Forbidden header list here。用户代理(即:浏览器)可以完全控制这些标头,而不是用户。
【讨论】:
以上是关于HttpServletRequest - 如何获取引用 URL?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 HttpServletRequest 获取请求 url [重复]
如何在一个类中获取HttpServletRequest 对象