【问题标题】:HttpServletRequest#getHeader("User-Agent") returns null browser nameHttpServletRequest#getHeader("User-Agent") 返回空浏览器名称
【发布时间】:2013-06-14 14:03:32
【问题描述】:

我使用的是 Java 6。我对 JSP 和 Servlet 的了解很少。

我正在使用以下代码来获取运行我的应用程序的浏览器名称:

String browserName = requestProvider.get().getHeader("User-Agent");

我还使用以下代码来获取运行我的应用程序的机器的 IP 地址:

String ipAdd = requestProvider.get().getRemoteAddr();

在这两种情况下,requestProvider 都是Provider<HttpServletRequest> 类型的引用变量。而且我确信它永远不会是NULL

现在问题是有时我得到两个值 (browserName and ipAdd) NULL。 我有时会写,因为我没有测试用例。

所以我的问题是,在 Java 中,这些值可以为 NULL 的情况是什么?

在编码时我应该注意什么以避免这个问题?

有没有其他方法可以每次都获取 IP 地址和浏览器名称?

【问题讨论】:

  • 某些客户端/浏览器可能不会发送 User-Agent 标头。试试user-agent
  • @TheNewIdiot 你能给我确切的代码吗?
  • 您不能信任请求中进入应用程序的单个字节。因此,你不能相信任何东西都是非空的。

标签: java servlets browser-detection


【解决方案1】:

String browserName = requestProvider.get().getHeader("User-Agent");

null 表示发送请求的人未包含"User-Agent" header

String ipAdd = requestProvider.get().getRemoteAddr();

在正常情况下不太可能返回 null,但有报道称它可能会在极端情况下返回 null,例如 after the response has already been sent。无论如何,“获取运行我的应用程序的机器的 IP 地址”听起来不像 getRemoteAddr() 的用途。用于获取最近发送请求的客户端或代理的地址。

有没有其他方法可以每次都获取 IP 地址和浏览器名称?

没有。您完全依赖 HTTP 客户端和/或任何干预代理的行为来获取此类信息。

【讨论】:

    【解决方案2】:

    尝试使用小写的用户代理,因为如果我们直接从标题访问它就可以了。

    String browserName = requestProvider.get().getHeader("user-agent");

    获取 IP 地址的另一种方法是

    String ip = requestProvider.get().getHeader("True-Client-IP");如果我们有 akamai 整数,这将有效。

    【讨论】:

    • 标题名称不区分大小写
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    • 2016-02-14
    • 2013-10-30
    • 2020-07-07
    • 1970-01-01
    • 2018-09-25
    • 1970-01-01
    相关资源
    最近更新 更多