In meiner JSF-Anwendung, nach erfolgreicher Anmeldung, ich bin navigieren zu meiner Homepage meiner Anwendung, wo ich eine Logout
Link.
Hier ist die entsprechende HTML für den Logout-Link.
<div id="top_white">
<div style="float: right"><tr:form><tr:commandLink id="logout" action="#{Controller.Logout}"><img alt="logout" src="../../images/logout.gif"/></tr:commandLink></tr:form></div>
</div>
Und hier ist mein Controller
das ist sessionscoped
public class Controller {
private static Logger LOGGER = Logger.getLogger(Controller.class);
public Controller() {
req = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
session = req.getSession(false);
String userid = session.getAttribute("userid").toString();
if(List == null){
List = new ArrayList<List>();
List = new DAO().loadListByid(Long.valueOf(userid));
LOGGER.debug("successfully loaded the list for the user");
}
}
private long Username;
private String Password=null;
HttpServletRequest req;
HttpSession session;
private List<List> List=null;
// getter and setters
public String Logout(){
session.invalidate();
LOGGER.debug("In LogOut");
return "loggedout";
}
}
Im Constructor prüfe ich die Userid in der Session und lade eine spezifische Liste für den User.
Ich habe auch eine ServletFilter
Wenn sie nicht gefunden wird, wird auf die Seite InvalidUser umgeleitet. /faces/jsp/*
so dass für alle jsp's im jsp-Ordner auf id in der Sitzung geprüft wird.
Hier ist die doFilter
Methode meines Filters
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
LOGGER.debug("In doFilter");
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
HttpSession session = request.getSession(false);
LOGGER.debug("request:" + request.getRequestURL().toString());
try{
if (session.getAttribute("id") != null) {
LOGGER.debug("id found:" + session.getAttribute("id"));
chain.doFilter(req, res); // id found, so just continue request.
}
}catch(NullPointerException e){
LOGGER.debug("No id found Exception: ", e);
response.sendRedirect(properties.getProperty(INVALID_USER_REDIRECTURL, true)); // No id found, so redirect to Invalid user page.
}
}
Ich habe auch eine PhaseListener
um den JSF-Lebenszyklus zu debuggen, der aus aquí .
Wenn die Seite zum ersten Mal geladen wird, sehe ich das folgende Serverprotokoll mit nur ersten und letzten Phasen des JSF-Lebenszyklus
["http-bio-8090"-exec-114] DEBUG SessionFilter - In doFilter
["http-bio-8090"-exec-114] DEBUG SessionFilter - request:http://my homepageurl
["http-bio-8090"-exec-114] DEBUG SessionFilter - id found
["http-bio-8090"-exec-114] ERROR org.apache.myfaces.config.FacesConfigurator - Configuration objects do not support clean-up. Update aborted
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - START PHASE RESTORE_VIEW(1)
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - END PHASE RESTORE_VIEW(1)
["http-bio-8090"-exec-114] DEBUG org.apache.myfaces.lifecycle.LifecycleImpl - exiting from lifecycle.execute in RESTORE_VIEW(1) because getRenderResponse is true from one of the after listeners
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - START PHASE RENDER_RESPONSE(6)
["http-bio-8090"-exec-114] INFO org.apache.myfaces.config.annotation.DefaultLifecycleProviderFactory - Using LifecycleProvider org.apache.myfaces.config.annotation.AllAnnotationLifecycleProvider
["http-bio-8090"-exec-114] DEBUG Controller - id found in controller
["http-bio-8090"-exec-114] DEBUG DAOProperties - dao.properties loaded successfully
["http-bio-8090"-exec-114] DEBUG SvrConnection - In JNDI
["http-bio-8090"-exec-114] DEBUG DAO - Successfully connected to database
["http-bio-8090"-exec-114] DEBUG DAO - connection closed
["http-bio-8090"-exec-114] DEBUG Controller - successfully loaded the list for the user
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - END PHASE RENDER_RESPONSE(6)
Das obige Protokoll ist wie erwartet, weil es keine Formularübermittlung gibt, so dass nur die erste und die letzte Phase aufgeführt sind.
Aber das eigentliche Problem entsteht, wenn ich auf die Logout
commandLink, den ich oben in diesem Beitrag erwähnt habe.
Nachdem ich auf die Logout
Link, hier ist das Serverprotokoll.
["http-bio-8090"-exec-114] DEBUG SessionFilter - In doFilter
["http-bio-8090"-exec-114] DEBUG SessionFilter - request:http://my homepage url
["http-bio-8090"-exec-114] DEBUG SessionFilter - appid found
["http-bio-8090"-exec-114] ERROR org.apache.myfaces.config.FacesConfigurator - Configuration objects do not support clean-up. Update aborted
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - START PHASE RESTORE_VIEW(1)
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - END PHASE RESTORE_VIEW(1)
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - START PHASE APPLY_REQUEST_VALUES(2)
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - END PHASE APPLY_REQUEST_VALUES(2)
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - START PHASE PROCESS_VALIDATIONS(3)
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - END PHASE PROCESS_VALIDATIONS(3)
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - START PHASE UPDATE_MODEL_VALUES(4)
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - END PHASE UPDATE_MODEL_VALUES(4)
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - START PHASE INVOKE_APPLICATION(5)
["http-bio-8090"-exec-114] DEBUG Controller - In LogOut
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - END PHASE INVOKE_APPLICATION(5)
["http-bio-8090"-exec-114] DEBUG org.apache.myfaces.lifecycle.LifecycleImpl - exiting from lifecycle.execute in INVOKE_APPLICATION(5) because getRenderResponse is true from one of the after listeners
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - START PHASE RENDER_RESPONSE(6)
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - END PHASE RENDER_RESPONSE(6)
["http-bio-8090"-exec-116] DEBUG SessionFilter - In doFilter
["http-bio-8090"-exec-116] DEBUG SessionFilter - request:http://my homepage url
["http-bio-8090"-exec-116] DEBUG SessionFilter - No id found Exception:
java.lang.NullPointerException
Aus dem obigen Protokoll geht hervor, dass meine Aktionsmethode wie erwartet in der INVOKE_APPLICATION
und die meines Controllers Logout()
Methode wird aufgerufen und die Sitzung wird ungültig gemacht und der String loggedout
zurückgegeben wird.
Ich habe die folgende Navigationsregel in der faces-config.xml
<navigation-rule>
<from-view-id>/jsp/Services.jsp</from-view-id>
<navigation-case>
<from-outcome>loggedout</from-outcome>
<to-view-id>/others/Logout.jsp</to-view-id>
</navigation-case>
</navigation-rule>
Aber diese navigation-rule
wird nicht ausgeführt. Stattdessen wird in der RENDER_RESPONSE
Phase, versucht es, meine Homepage neu zu laden. Offensichtlich hat es nicht die id
in der Sitzung, die zum Auslösen einer NullPointerException
.
Ich habe die jsp's in den jeweiligen Ordnern wie oben angegeben. Ich bin mit JSF 1.2 und myFaces 1.2.9.
1) Warum wird der Navigationsfall nicht ausgeführt?
2) Warum wird die Url meiner Startseite erneut geladen?
Bitte helfen Sie mir.