Play框架(Websocket):从请求标头获取浏览器信息

时间:2013-04-08 06:20:41

标签: playframework http-headers websocket

我使用this示例中的代码来获取客户端的浏览器信息。但是,对于我的情况,关键用户代理仅适用于Firefox,此密钥没有针对Chrome或Safari的密钥。所以,我正在为Chrome或Safari获取 None 对象。任何人都可以提供一种通用的方式从Play获取浏览器名称,版本等信息!控制器?

更新

我使用的是Websocket协议,而不是http(虽然它们在很多方面类似),我使用的是Play 2.1.0(使用Java 1.7.0_17和Scala 2.10.0)。我的代码就像def actorWebSocket = WebSocket.async[String] { implicit request => ...,并从http://websocket.org/echo.html向我的服务器发送请求。 (我使用支持websocket测试的所有浏览器)。虽然简单的http请求显示Firefox,Safari和Chrome的User-Agent,但是websocket无法显示Safari和Chrome的User-Agent。 @nico_ekito和@le_douard建议这可能是浏览器问题。

4 个答案:

答案 0 :(得分: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相同。

答案 1 :(得分:0)

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

request.headers.get("User-Agent")

答案 2 :(得分:0)

在我的play 2.0.4项目的lib目录中使用UserAgentUtils-1.6.jar,我一直以这种方式使用user-agent,例如识别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 for http请求的Excel工作表,则会崩溃。

我帮助......

答案 3 :(得分:0)

此代码对我有用:

String agent = request().getHeader(Http.HeaderNames.USER_AGENT);