2

我正在使用示例中的代码来获取客户端的浏览器信息。但是对于我的情况,密钥用户代理仅适用于 Firefox,Chrome 或 Safari 没有此密钥可用的密钥。所以,我得到了 Chrome 或 Safari 的None对象。谁能提供一种通用的方法来从 Play 中获取浏览器名称、版本等信息!控制器?

更新

我使用的是 Websocket 协议,而不是 http(尽管它们在很多方面都很相似),我使用的是 Play 2.1.0(使用 Java 1.7.0_17 和 Scala 2.10.0)。我的代码就像从http://websocket.org/echo.htmldef actorWebSocket = WebSocket.async[String] { implicit request => ...向我的服务器发送请求。(我测试过的所有浏览器都支持 websocket)。尽管简单的 http 请求确实显示了 Firefox、Safari 和 Chrome 的用户代理,但 websocket 未能显示 Safari 和 Chrome 的用户代理。@nico_ekito 和 @le_douard 建议这可能是浏览器问题。

4

4 回答 4

1

实际上play框架给了我们一切(甚至很多知道的标题名称)。这是控制器类的静态函数中的代码

public class Application extends Controller {
    public static Result index() {
        String userAgent = request().headers().get(Http.HeaderNames.USER_AGENT);
        return ok(userAgent);
    }
}

自然地,我假设您指向路由文件中某处的 routes.Application.index() 。

如果您还想知道如何解析用户代理,我也建议您查看:
https ://code.google.com/p/user-agent-utils/

6 个月前,我在一个项目中使用了它,我不知道它的更新程度,但当我需要它以获得更多有用和可读的信息时,它对我来说非常有用。

一些浏览器没有完全实现 WebSockets 协议应该有的东西

毕竟它是一个仍在定义/开发中的协议。

对于 chrome,这是一个带有票证的错误 https://code.google.com/p/chromium/issues/detail?id=128170

显然它最近已修复,应该很快推出?我认为它与 Safari 相同。

于 2013-04-10T20:44:43.417 回答
0

AFAIK,它在我的应用程序中使用“User-Agent”键工作:

request.headers.get("User-Agent")
于 2013-04-08T07:15:52.233 回答
0

在我的 play 2.0.4 项目的 lib 目录中拥有 UserAgentUtils-1.6.jar,我一直在以这种方式使用用户代理,例如识别 iPhone 模拟器调用:在我的控制器顶部:

import nl.bitwalker.useragentutils.UserAgent;

并在方法中:

    UserAgent userAgent = UserAgent.parseUserAgentString(Http.Context.current().request().getHeader("User-Agent"));
        Boolean iphone_l = false;
        if (userAgent.getOperatingSystem().equals("MAC_OS_X") &&
            userAgent.getOperatingSystem().getManufacturer().equals("APPLE") &&
            userAgent.getOperatingSystem().getGroup().equals("MAC_OS_X") &&
            userAgent.getOperatingSystem().getDeviceType().equals("COMPUTER") &&
            userAgent.getBrowser().equals("CFNETWORK") &&
            userAgent.getBrowser().getGroup().equals("CFNETWORK") &&
            userAgent.getBrowser().getManufacturer().equals("CFNETWORK")) {
            iphone_l = true;
        }

...即使在 Chrome 中也能正常工作(未尝试过 IE),但如果请求来自带有 wininet.dll 用于 http 请求的 Excel 工作表,则会崩溃。

我帮助...

于 2013-04-12T13:57:28.813 回答
0

这段代码对我有用:

String agent = request().getHeader(Http.HeaderNames.USER_AGENT);
于 2017-06-27T20:06:04.427 回答