Playframework 播放框架(Websocket):从请求头获取浏览器信息

Playframework 播放框架(Websocket):从请求头获取浏览器信息,playframework,http-headers,websocket,Playframework,Http Headers,Websocket,我使用示例中的代码来获取客户端的浏览器信息。但是keyuser agent仅适用于Firefox,在我的情况下,Chrome或Safari没有可用于此密钥的密钥。所以,我没有为Chrome或Safari提供任何对象。任何人都可以提供一个通用的方式来获取信息,如浏览器名称,版本等从一个发挥!控制器 更新 我使用的是Websocket协议,而不是http(尽管它们在许多方面相似),我使用的是Play 2.1.0(使用Java 1.7.0_17和Scala 2.10.0)。我的代码类似于def act

我使用示例中的代码来获取客户端的浏览器信息。但是keyuser agent仅适用于Firefox,在我的情况下,Chrome或Safari没有可用于此密钥的密钥。所以,我没有为Chrome或Safari提供任何对象。任何人都可以提供一个通用的方式来获取信息,如浏览器名称,版本等从一个发挥!控制器

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

AFAIK,它在我的应用程序中使用“用户代理”键工作:


实际上,play框架为我们提供了一切(甚至很多已知的头文件名)。这是控制器类静态函数中的代码

public class Application extends Controller {
    public static Result index() {
        String userAgent = request().headers().get(Http.HeaderNames.USER_AGENT);
        return ok(userAgent);
    }
}
当然,我假设您指向routes文件中的routes.Application.index()

如果您还想知道如何解析用户代理,我还建议您签出:

我在6个月前的一个项目中使用了它,我不知道它是如何更新的,但是当我需要它来获取更有用和可读的信息时,它对我来说非常有用

有些浏览器没有完全实现WebSockets协议应该具备的功能 毕竟,这是一个仍在定义/开发中的协议

对于chrome来说,这是一个有问题的bug

显然,它最近已经修复,应该很快推出?
我假设Safari也是如此。

在我的play 2.0.4项目的lib目录中有UserAgentUtils-1.6.jar,我一直以这种方式使用useragent,例如识别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)中也能正常工作,但如果请求来自Excel工作表,且http请求为wininet.dll,则会崩溃


我认为这有助于…

此代码对我有效:

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

在Firefox中,我得到了这样一个k=>v映射:用户代理=>Buffer(Mozilla/5.0(Windows NT 6.1;rv:19.0)Gecko/20100101 Firefox/19.0),但Chrome和Safari都没有显示任何名为用户代理的密钥。您是否使用前端代理(apache、nginx…)以及Play的哪个版本?1.x、2.x?我使用Play 2.1.0(使用Java 1.7.0和Scala 2.10.0).FYI,我正在使用一个web套接字,如:
def actorWebSocket=WebSocket.async[String]{implicit request=>…
,并从发送请求到我的服务器。(我使用支持WebSocket测试的所有浏览器).您是否尝试过不使用websocket,但使用简单的http请求?答案很好,但您需要在Play 2.5中将“HeaderNames”替换为“HeaderNames”
http.HeaderNames
而不是
http.HeaderNames
String agent = request().getHeader(Http.HeaderNames.USER_AGENT);