java – Oracle Webcenter Spaces和Internet Explorer 9

我正在开发一个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进行测试.

最佳答案 令人遗憾的是,ADF会在User-Agent标头中添加基于MSIE属性的X-UA兼容标签.据我所知,覆盖此行为的唯一方法是使用servlet过滤器.您可以在其中通过User-Agent中的Trident属性确定IE引擎版本,并设置适当的X-UA兼容标记.

我们成功地将以下代码用于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);
}

因此,我们通过Trident属性确定IE版本,IE8为4,IE9为5,即使是兼容模式.但在兼容模式IE8和IE9中添加MSIE 7.0属性,我们根据引擎版本替换为MSIE 8.0或MSIE 9.0.

点赞