1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.myfaces.tobago.webapp;
21
22 import org.apache.myfaces.tobago.portlet.PortletUtils;
23 import org.slf4j.Logger;
24 import org.slf4j.LoggerFactory;
25
26 import javax.faces.FacesException;
27 import javax.faces.context.ExternalContext;
28 import javax.faces.context.FacesContext;
29 import javax.faces.event.AbortProcessingException;
30 import javax.faces.event.ActionEvent;
31 import javax.faces.event.ActionListener;
32 import javax.portlet.PortletSession;
33 import javax.servlet.http.HttpSession;
34 import java.io.IOException;
35 import java.lang.invoke.MethodHandles;
36
37 public class LogoutActionListener implements ActionListener {
38
39 private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
40
41 @Override
42 public void processAction(final ActionEvent event) throws AbortProcessingException {
43 final FacesContext facesContext = FacesContext.getCurrentInstance();
44 final ExternalContext externalContext = facesContext.getExternalContext();
45 final Object session = externalContext.getSession(false);
46 if (session != null) {
47 if (session instanceof HttpSession) {
48 ((HttpSession) session).invalidate();
49 }
50 if (PortletUtils.isPortletApiAvailable() && session instanceof PortletSession) {
51 ((PortletSession) session).invalidate();
52 }
53 }
54 final String forward = externalContext.getRequestContextPath() + "/";
55 try {
56 externalContext.redirect(forward);
57 } catch (final IOException e) {
58 LOG.error("", e);
59
60 throw new FacesException("Can't redirect to '" + forward + "'");
61 }
62 facesContext.responseComplete();
63 }
64
65 }