Redirect to previous View after Login
ryneezy.ryan.samiley.live.com Dec 14, 2010 4:54 PMThe system I'm working on sends on out notification e-mails composed of a link users click on to get back the application view so the user can perform some action. Users are likely not logged in at the time so after the login I want the user redirected back to the original view listed in the e-mail.
I tried this in components.xml:
<event type="org.jboss.seam.security.notLoggedIn"> <action execute="#{redirect.captureCurrentView}"/> </event> <event type="org.jboss.seam.security.postAuthenticate"> <action execute="#{redirect.returnToCapturedView}"/> </event>
It wasn't performing the redirect. I tried injecting the org.jboss.seam.faces.Redirect into my Authentication object but the viewId was always returning null. Is this because the Authentication object is Session scoped?
I also tried creating my own view capturing object so it was easier to debug.
@AutoCreate @Name("redirectWrapper") @Scope(ScopeType.CONVERSATION) @SuppressWarnings("serial") public class GotoEntityAction implements Serializable { @In (required = true) private Redirect redirect; private String viewId; private Map<String, Object> parameters; public RedirectWrapper() { parameters = new HashMap<String, Object>(0); } public void captureCurrentView() { redirect.captureCurrentView(); // Make a defensive copy String tmpString = redirect.getViewId(); if (tmpString != null) { viewId = String.copyValueOf(tmpString.toCharArray()); } // Make a defensive copy Map<String, Object> tmpMap = redirect.getParameters(); if (tmpMap != null) { parameters = new HashMap<String, Object>(tmpMap); } } public boolean returnToCapturedView() { if (viewId == null) { return false; } // Set the view and parameters back to the ones we copied redirect.setViewId(viewId); Set<String> keys = parameters.keySet(); for (String key : keys) { redirect.setParameter(key, parameters.get(key)); } return redirect.returnToCapturedView(); } public boolean shouldRedirect() { return viewId != null; } }
I set this in the components.xml
<event type="org.jboss.seam.security.notLoggedIn"> <action execute="#{redirectWrapper.captureCurrentView}"/> </event> <event type="org.jboss.seam.security.postAuthenticate"> <action execute="#{redirectWrapper.returnToCapturedView}"/> </event>
I can set a break point at RedirectWrapper.captureCurrentView() and see everything works, but the problem with this is I get a completely new RedirectWrapper object when I try to inject it into my AuthenticationAction object so I lose all the captured view and parameter data. Also when I set a breakpoint at the RedirectWrapper.returnToCapturedView method is never called.
What am I doing wrong?