我目前正在为我的 Web 应用程序添加 HTML5 离线支持,并且主要遵循与 mgwt 相同的方法:
- 在计算时按排列生成清单文件
- 基于浏览器的用户代理,使用 servlet 提供清单文件。
我的问题涉及第 2 步:在我的 servlet 中,我想检测为某个请求提供哪种排列。我现在这样做的方式是:
- 从请求中获取用户代理字符串
将此(使用简单的字符串操作(例如
userAgent.contains("safari")
)映射到“代理ID”,我可以使用映射文件将其映射到排列强名称。换句话说,映射Mozilla/4.0 (compatible; MSIE 6.0b; Windows NT 5.1)
到ie6
我可以映射的(使用生成的映射文件,请参阅下面的例子)到15B454D690F2CCAD57F1DD809429BF42
。<permutation name="15B454D690F2CCAD57F1DD809429BF42"> <user.agent>ie6</user.agent> </permutation>
我面临的问题:我想使用与 GWT 使用的相同的方法将用户代理字符串链接到排列(即 map Mozilla/4.0 (compatible; MSIE 6.0b; Windows NT 5.1)
to ie6
)。这样,每当我的 GWT 使用其他排列/浏览器版本更新时,我就不必修复我的代码。换句话说,我不喜欢我当前的解决方案,即在我的排列映射中天真地将 servlet 中的完整用户代理字符串与用户代理“id”(在我的示例中为“ie6”)进行匹配。我想到的解决方案是:
- 页面加载后,检测加载的排列,并将其作为参数传递给 servlet。然后在获取该排列的清单后,使用 javascript 将其作为 html 标记的属性插入。但是,动态插入它似乎无法正常工作。(请参阅动态触发 HTML5 缓存清单文件?)(同一篇文章解释了使用 iframe 动态执行此操作的解决方法,但我更喜欢更简洁的解决方案)
- 在我的 servlet 中,以某种方式使用客户端将完整的用户代理字符串映射到一个排列。我更喜欢这个解决方案,但还没有找到实现这一目标的方法...... GWT 使用 javascript 来实现这一目标(参见UserAgentPropertyGenerator)。我可以在我的 servlet 中执行这个,但是这个 javascript 方法不仅使用用户代理,还使用 dom 文档......还有其他我忽略的解决方案吗?当然,其他人在创建 HTML5 清单文件时也一定遇到过这个问题......