https://blogs.oracle.com/jdeveloperpm/entry/oracle_jdeveloper_and_adf_patches
Recientemente Microsoft ha lanzado su nueva versión 11 de Internet Explorer. En el desarrollo de ADF-aplicaciones la pregunta más obvia es, por supuesto: ¿mi aplicación seguirá funcionando? La respuesta corta es: no, usted tiene que esperar hasta que Oracle lleva a cabo un nuevo parche. Cuando intenta ejecutar la aplicación, usted recibirá un mensaje emergente en el hecho de que usted está utilizando una versión del navegador no compatible...
Y la buena noticia es que hemos encontrado una solución que funciona para Internet Explorer 11.
Empecemos:
Cuando ADF recibe una solicitud del "browser" en las cabeceras determina el "user-agent" del navegador, en versiones anteriores a IE 11, estas concordaban con la versión del navegador por ejemplo Internet Explorer 10, escribíamos un meta-tag <meta http-equiv="X-UA-Compatible content="IE=10.0">, el problema ha venido en la version IE11 que en la cabecera se cree que viene un navegador tipo "Gecko-like Browser".
Entonces lo que haremos será crear un filtro, que determine el "user-agent" que estamos usando, y si proviene de un IE 10 o IE 11, lo remplazaremos para que ADF piense que viene de un Internet Explorer 9, y establezca los meta-tag adecuados.
Aclarado todo el proceso ha realizar sigamos con la parte programática:
Lo primero que haremos es crear la clase:
package view;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
public class IECompatibleFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
String userAgentStr = ((HttpServletRequest)request).getHeader("user-agent");
// Comprobamos el user-agent utilized y devolvemos la header
if (userAgentStr != null && (userAgentStr.contains("MSIE 1") ||
userAgentStr.contains("Trident"))) {
ServletRequest wrappedRequest = new WrapperRequest((HttpServletRequest)request);
chain.doFilter(wrappedRequest, response);
} else {
chain.doFilter(request, response);
}
}
public void destroy() {
}
public void init(FilterConfig arg0) throws ServletException {
}
private class WrapperRequest extends HttpServletRequestWrapper {
public WrapperRequest(HttpServletRequest request) {
super(request);
}
public String getHeader(String name) {
// IE 10: remplazamos IE10 por IE9
HttpServletRequest request = (HttpServletRequest)getRequest();
if ("user-agent".equalsIgnoreCase(name) && request.getHeader("user-agent").contains("MSIE 10")) {
return request.getHeader("user-agent").replaceAll("MSIE [^;]*;", "MSIE 9.0;");
}
// IE 11: remplazamos IE11 por IE9
if ("user-agent".equalsIgnoreCase(name) && request.getHeader("user-agent").contains("Trident")) {
String newAgentStr = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.2; Trident/6.0)";
return newAgentStr;
}
return request.getHeader(name);
}
}
}
Ahora crearemos el filtro en el "web.xml"
<filter>
<filter-name>IECompatibleFilter</filter-name>
<filter-class>view.IECompatibleFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>IECompatibleFilter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
<filter-mapping>
Gracias por su atención, y un saludo.
Rafael Prada Gómez
Muy buena solución.
ResponderEliminarGracias
Abel Manzanera