基于用户代理检测服务器上的GWT置换

时间:2013-09-09 10:59:57

标签: javascript html5 gwt offline-caching mgwt

我目前正致力于为我的网络应用程序添加HTML5离线支持,并且主要采用相同的mgwt方法:

  1. 在编译时按照排列生成清单文件
  2. 使用servlet根据浏览器的用户代理提供清单文件。
  3. 我的问题涉及第2步:在我的servlet中,我想检测为某个请求服务的排列。我现在这样做的方式是:

    • 从请求中获取用户代理字符串
    • 将此(使用简单的字符串操作(例如userAgent.contains("safari"))映射到“代理ID”,我可以使用映射文件将其映射到排列强名称。换句话说,映射{{1 {}} Mozilla/4.0 (compatible; MSIE 6.0b; Windows NT 5.1),我可以映射(使用生成的映射文件,请参阅下面的示例)到ie6

      15B454D690F2CCAD57F1DD809429BF42

    我面临的问题:我想使用相同的方法将用户代理字符串链接到GWT使用的排列(即将<permutation name="15B454D690F2CCAD57F1DD809429BF42"> <user.agent>ie6</user.agent> </permutation> 映射到Mozilla/4.0 (compatible; MSIE 6.0b; Windows NT 5.1))。这样,每当我的GWT更新其他排列/浏览器版本时,我就不必修改我的代码。换句话说,我不喜欢我的当前解决方案,即在我的排列映射中将servlet中的完整用户代理字符串与用户代理“id”(在我的示例中为“ie6”)进行天真匹配。 我想到的解决方案是:

      页面加载后
    • 检测加载的排列,并将其作为参数传递给servlet。然后在获取该排列的清单后,使用javascript将其作为html标记的属性插入。但是,动态插入它似乎无法正常工作。 (参见Dynamically Trigger HTML5 Cache Manifest file?)(同一篇文章解释了使用iframe动态执行此操作的解决方法,但我更喜欢更清洁的解决方案)
    • 以某种方式使用客户端将完整的用户代理字符串映射到我的servlet中的排列。我更喜欢这个解决方案,但还没有找到实现这个目标的方法...... GWT使用javascript来实现这一点(参见UserAgentPropertyGenerator)。 我可以在我的servlet中执行它,但是这个javascript方法不仅使用用户代理,还使用dom文档...... 我还有其他解决方案吗?当然,在创建HTML5清单文件时,其他人肯定也遇到过这个问题...

1 个答案:

答案 0 :(得分:0)

您可以利用HTML5Manifest提供的mgwt解决方案。它们有一个linker,它生成一个可以由它们提供的servlet读取的文件,并根据用户代理标题返回适当的文件列表以供浏览器缓存。

如果你想自己做,你可以根据http用户代理标题,以及gwt编译器生成的compilation-mappings.txt文件,找出每个浏览器最合适的排列。正在使用xsiframe链接器。