2012-04-06 7 views
0

Wenn die Login-Seite von meinem Portal zur Index-Seite zu navigieren, ist es eine Situation, wenn auf einigen Tatsachen beruhen kann der Benutzer extern umgeleitet werden, die wie folgt aussieht:JSF Umleitung Ausnahme

if (!(marketVo.getAbsoluteUrl() != null && marketVo.getAbsoluteUrl().equals(absoluteUrlToRedirect))) { 
logger.info("---WILL REDIRECT TO ABS URL: " + absoluteUrlToRedirect); 
final FacesContext context = FacesContext.getCurrentInstance(); 
context.responseComplete(); 
try { 
    final HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse(); 

    if (context.getViewRoot() != null) { 
     // this step will clear any queued events 
     context.getViewRoot().processDecodes(context); 
    } 
    response.sendRedirect(absoluteUrlToRedirect); 

} catch (final Exception e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

}

Nun, wirft es eine Ausnahme:

14:24:35,579 INFO [CmwSessionHelperBean] ---WILL REDIRECT TO ABS URL: http://hi 
tachi.mygravitant.com 
14:24:35,580 ERROR [STDERR] java.lang.IllegalStateException 
14:24:35,582 ERROR [STDERR]  at org.apache.catalina.connector.ResponseFacade. 
sendRedirect(ResponseFacade.java:435) 
14:24:35,590 ERROR [STDERR]  at com.example.cloud.common.jsf.core.beans.Cmw 
SessionHelperBean.createCmwUserSession(CmwSessionHelperBean.java:269) 

können Sie mir bitte einen Vorschlag geben Sie mir diese Ausnahme zu vermeiden occure? Bitte beachten Sie, dass die Umleitung erfolgt ist, aber wegen dieser Ausnahme, wenn ich zu meinem Portal zurückkomme, funktioniert es nicht mehr einwandfrei ...

Antwort

1

Sie sollten ExternalContext#redirect() verwenden, um eine Weiterleitung in einer JSF-sicheren Weise durchzuführen .

public void createCmwUserSession() throws IOException { 

    if (!(marketVo.getAbsoluteUrl() != null && marketVo.getAbsoluteUrl().equals(absoluteUrlToRedirect))) { 
     logger.info("---WILL REDIRECT TO ABS URL: " + absoluteUrlToRedirect); 
     FacesContext.getCurrentInstance().getExternalContext().redirect(absoluteUrlToRedirect); 
    } 
} 

Diese Methode wird auch anrufen implizit FacesContext#responseComplete(), brauchen Sie nicht, es selbst zu tun.

Weiterhin müssen Sie sicherstellen, dass Sie die Redirect-Methode nicht mehrmals für die gleiche Antwort aufrufen oder eine Navigation durchführen.