What is the best possible way to invalidate session within a JSF 2.0 application? I know JSF itself does not handle session. So far I could find
private void reset() { HttpSession session = (HttpSession) FacesContext.getCurrentInstance() .getExternalContext().getSession(false); session.invalidate(); }
@SessionScoped
UserBean handles the login-logout of a user. I have this method in the same bean. Now when I call the reset()
method after I'm done with necessary DB updates, what will happen to my current session scoped bean? since even the bean itself is stored in HttpSession
?Correct Option: CWe can invalidate session by calling session. invalidate() to destroy the session.
Try passing false as the parameter to the getSession(boolean) . This will give back a session if it exists or else it will return null . HttpSession session = request. getSession(false); if (session == null || !
The session scope allows you to create and bind objects to a session. It gets created upon the first HTTP request involving this bean in the session and gets destroyed when the HTTP session is invalidated. The request scope is present in JSF and CDI and functions in the same way.
Firstly, is this method correct? Is there a way without touching the ServletAPI?
You can use ExternalContext#invalidateSession()
to invalidate the session without the need to grab the Servlet API.
@ManagedBean @SessionScoped public class UserManager { private User current; public String logout() { FacesContext.getCurrentInstance().getExternalContext().invalidateSession(); return "/home.xhtml?faces-redirect=true"; } // ... }
what will happen to my current session scoped bean? since even the bean itself is stored in HttpSession?
It will still be accessible in the current response, but it will not be there anymore in the next request. Thus it's important that a redirect (a new request) is fired after invalidate, otherwise you're still displaying data from the old session. A redirect can be done by adding faces-redirect=true
to the outcome, as I did in the above example. Another way of sending a redirect is using ExternalContext#redirect()
.
public void logout() throws IOException { ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext(); ec.invalidateSession(); ec.redirect(ec.getRequestContextPath() + "/home.xhtml"); }
Its use is however questionable in this context as using a navigation outcome is simpler.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With