2009-02-26 12 views
5

Tengo dos sistemas que intento integrar. Uno se basa en servlets sin procesar, el nuevo se basa en JSF con IceFaces. Estoy tratando de facilitar el inicio de sesión entre sistemas. La idea es que tengo un botón en el sistema anterior que PUBLICA la información apropiada al nuevo sitio y los inicia sesión.Generando un Contexto de Caras manualmente

Bueno, idealmente, me gustaría usar solo un servlet antiguo para facilitarlo en el nuevo sitio. Vaya al Servlet del nuevo sitio, haga lo que debe hacer y el reenvío al tablero.

Nuestra seguridad se maneja a través de un bean administrado. Sin embargo, cuando llega al servlet, no hay contexto de rostros. Entonces, ¿cómo crearía un nuevo contexto de caras?

Tengo un plan de respaldo en el que siempre puedo enlazar a una página ficticia .Face que creará el FacesContext para mí y luego creará un bean de respaldo que hará las cosas cuando sea instanciado y luego lo reenviará a la página principal . Pero esto se parece mucho a un truco.

¡Cualquier ayuda sería apreciada!

EDIT: Fui con el camino de regreso. Básicamente, he puesto a una página de este modo:

<f:view> 
    <ice:outputText value="#{EntryPoint}"/> 
</f:view 

El bean de respaldo que parece tan ...

public EntryPoint() { 
     try { 
     HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); 
     HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse(); 
     String loginID = request.getParameter("loginID"); 
     //Do some code to load the user/permissions 
     response.sendRedirect(
      //The appropriate page 
     ); 
     } catch (IOException ex) { 
     logger.error(null, ex); 
     } catch (SQLException ex) { 
     logger.error(null, ex); 
     } 
    } 

Esto todavía se siente como un truco, pero no estoy seguro de cómo moverse esta. Lo ideal sería POSTAR con un servlet, obtener el ID de inicio de sesión, crear el usuario y ponerlo directamente en el bean administrado. Pero, FacesContext no existe en ese punto.

¿Alguna otra idea?

Respuesta

4

No estoy seguro de lo que quiere decir con "sitio" en este contexto.

Un par de notas:

  • granos serán administrados no estén disponibles fuera de la aplicación Web (WAR) en el que se definen.
  • Las instancias del objeto FacesContext se crean y eliminan finalmente por FacesServlet.service, por lo que las solicitudes deben pasar a través de este servlet. Intentar crear un contexto bajo otras circunstancias puede llevar a un comportamiento indefinido.

Teniendo esto en mente, se puede crear una secuencia de solicitud de la siguiente manera:

FacesServlet (mapping: /faces/*) 
-> /faces/jsfPage.jsp (a JSP with JSF controls) 
    -> DispatchBean (calls ExternalContext.dispatch("/AnotherServlet") 
     -> AnotherServlet 

jsfPage.JSP contiene:

<f:view> 
    <h:outputText value="#{dispatchBean.dispatch}" /> 
</f:view> 

La propiedad "expedición" se resuelve en un método de bean "getDispatch":

public String getDispatch() { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    try { 
     context.getExternalContext().dispatch("/FacesClientServlet"); 
    } catch (IOException e) { 
     throw new FacesException(e); 
    } 
    return null; 
} 

cual despacha a este servlet:

public class FacesClientServlet extends javax.servlet.http.HttpServlet 
     implements javax.servlet.Servlet { 

    static final long serialVersionUID = 1L; 

    @Override 
    protected void doGet(HttpServletRequest request, 
      HttpServletResponse response) throws ServletException, IOException { 

     FacesContext context = FacesContext.getCurrentInstance(); 
     ELContext elContext = context.getELContext(); 
     ExpressionFactory expressionFactory = context.getApplication() 
       .getExpressionFactory(); 
     ValueExpression expression = expressionFactory.createValueExpression(
       elContext, "#{myBean.text}", Object.class); 
     Object value = expression.getValue(elContext); 

     ResponseWriter writer = context.getResponseWriter(); 
     writer.write("" + value); 

    } 

} 

que emite el valor de una bean gestionado "myBean":

public class MyBean { 

    private final String text = "Hello, World!"; 

    public String getText() { 
     return text; 
    } 

} 

Todo esto es muy complicado y no me gustaría hacer nada de eso.


Una alternativa, que puede venir con sus propias consecuencias, es crear su propio contexto de esta manera:

public class ContextServlet extends javax.servlet.http.HttpServlet implements 
     javax.servlet.Servlet { 
    static final long serialVersionUID = 1L; 

    private FacesContextFactory facesContextFactory; 
    private Lifecycle lifecycle; 

    @Override 
    public void init(ServletConfig config) throws ServletException { 
     super.init(config); 

     LifecycleFactory lifecycleFactory = (LifecycleFactory) FactoryFinder 
       .getFactory(FactoryFinder.LIFECYCLE_FACTORY); 
     facesContextFactory = (FacesContextFactory) FactoryFinder 
       .getFactory(FactoryFinder.FACES_CONTEXT_FACTORY); 
     lifecycle = lifecycleFactory 
       .getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE); 
    } 

    @Override 
    protected void doGet(HttpServletRequest request, 
      HttpServletResponse response) throws ServletException, IOException { 

     FacesContext context = facesContextFactory.getFacesContext(
       getServletContext(), request, response, lifecycle); 
     try { 
      ELContext elContext = context.getELContext(); 
      ExpressionFactory expressionFactory = context.getApplication() 
        .getExpressionFactory(); 
      ValueExpression expression = expressionFactory 
        .createValueExpression(elContext, "#{myBean.text}", 
          Object.class); 
      Object value = expression.getValue(elContext); 

      PrintWriter pw = response.getWriter(); 
      try { 
       pw.write("" + value); 
      } finally { 
       pw.close(); 
      } 
     } finally { 
      context.release(); 
     } 
    } 

} 

Una vez más, yo evitaría este enfoque si es posible.

+0

La segunda es la respuesta que estaba buscando y la primera era mi plan de respaldo si no podía encontrar la primera. La idea era que el sitio de Servlet heredado (su propia aplicación web y el archivo WAR) redirigiría al usuario con un mensaje POST y credenciales a la nueva aplicación web. ¿Hay una mejor manera de hacer esto? – Drew