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 对象

如何获取httpservletrequest

如何在 @service 类中获取 HttpServletRequest 对象

如何遍历HttpServletRequest获取请求参数

如何从httpservletrequest requset获取requestid