4

我正在开发一个 WebCenter Spaces 应用程序,并在跨浏览器测试过程中观察到一些奇怪的行为:

当使用 Internet Explorer 8 访问该站点时,Spaces 很可能会插入以下元标记:

<meta http-equiv="X-UA-Compatible" content="IE=8.0">

使用 Internet Explorer 9 访问它时,启用了兼容性视图,但是,添加了以下标记:

<meta http-equiv="X-UA-Compatible" content="IE=7.0">

这强制要求实际使用兼容性视图。雪上加霜的是,会弹出一个警告对话框,通知用户必须禁用兼容性视图才能使用该应用程序。

当兼容性视图被禁用时,Spaces 会发送一个在这种情况下完全不执行任何操作的标签:

<meta http-equiv="X-UA-Compatible" content="IE=9.0">

为什么不按一般原则将这个标签发送到 IE9?然后这将禁用兼容模式并正确呈现页面,或者不是?如何自定义 WebCenter Spaces 以正确支持 IE9?

版本信息:目前使用 WebCenter 11.1.1.6,但我们将迁移到 11.1.1.5(不要问)——我正在 Windows Server 2008 R2 Standard x64 上使用 IE9 进行测试。

4

1 回答 1

2

很遗憾,但 ADF 确实在 User-Agent 标头中添加了X-UA-Compatible基于属性的标签。MSIE据我所知,覆盖此行为的唯一方法是使用 servlet 过滤器。您可以在其中通过User-Agent中的属性确定IE引擎版本Trident并设置适当的X-UA-Compatible标签。我们成功地将以下代码用于 servlet 过滤器:

public void doFilter(ServletRequest request, ServletResponse response, 
        FilterChain filterChain) throws IOException, ServletException {

    HttpServletRequest httpReq = (HttpServletRequest)request;
    String ua = httpReq.getHeader("User-Agent");

    Pattern patternEngineIE = Pattern.compile(".*Trident/(\\d).*");
    Matcher mEngineIE = patternEngineIE.matcher(ua);

    if (mEngineIE.find()) {
        int versionEngineIE = Integer.parseInt(mEngineIE.group(1));
        switch (versionEngineIE) {
        case 4:
            ua = ua.replaceAll("MSIE 7.0", "MSIE 8.0");
            response.addHeader("X-UA-Compatible", "IE=8");
            break;
        case 5:
            ua = ua.replaceAll("MSIE 7.0", "MSIE 9.0");
            response.addHeader("X-UA-Compatible", "IE=9");
            break;
        case 6:
            ua = ua.replaceAll("MSIE 7.0", "MSIE 10.0");
            response.addHeader("X-UA-Compatible", "IE=10");
            break;
        }
    }

    httpReq.addHeader("User-Agent", ua);
    filterChain.doFilter(httpReq, response);
}

因此,我们通过属性来确定 IE 版本Trident,IE8 为 4,IE9 为 5,即使是兼容模式也是如此。但是在兼容模式下 IE8 和 IE9 添加MSIE 7.0了我们替换到MSIE 8.0MSIE 9.0基于引擎版本的属性。

于 2012-08-24T13:21:54.833 回答