我使用这个例子中的代码来获取客户端的浏览器信息。但是键user-agent只适用于Firefox,对于我来说,没有这个键适用于Chrome或Safari。所以,我得到None对象Chrome或Safari。任何人都可以提供一种通用的方式来获取信息,如浏览器名称,版本等发挥!控制器吗?
更新我使用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认为这可能是浏览器的问题
实际上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,这是一个有票的bughttps://code.google.com/p/chromium/issues/detail?id=128170
显然它最近已经修复,应该很快推出?我想Safari也是一样的
AFAIK,它在我的应用程序中使用"User-Agent"键:
request.headers.get("User-Agent")
在我的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),但崩溃,如果请求来自Excel表格与wininet.dll的http请求。
这段代码为我工作:
String agent = request().getHeader(Http.HeaderNames.USER_AGENT);