miércoles, 16 de abril de 2014

Solución a el problema de IE 11 o IE 10 con Oracle Adf 11g

Entradas de oracle con el bug:
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


1 comentario: