我使用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建议这可能是浏览器问题。
答案 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个月前的一个项目中使用它,我不知道它是如何更新的,但是当我需要它以获得更有用和可读的信息时,它对我来说非常有用。
毕竟它仍然是一个仍在定义/开发下的协议。
对于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);