【问题标题】:HttpServletRequest - how to obtain the referring URL?HttpServletRequest - 如何获取引用 URL?
【发布时间】:2011-02-08 14:10:26
【问题描述】:

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

【问题讨论】:

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

标签: java servlets


【解决方案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。用户代理(即:浏览器)可以完全控制这些标头,而不是用户。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-21
      • 2020-02-11
      • 2012-11-10
      • 2014-07-04
      • 1970-01-01
      • 2010-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多