Nevermind. I managed to find a working solution without creating
dymamic Result objects.
So in the interceptor code:
public String intercept(ActionInvocation invocation) throws Exception
{
ActionContext context = invocation.getInvocationContext();
Map session = context.getSession();
String action = invocation.getProxy().getActionName();
String namespace = invocation.getProxy().getNamespace();
if ( ( action.equals("login") || action.equals("doLogin") )
&& namespace.equals("/") )
return invocation.invoke();
Object user = session.get("user");
if ( user == null )
{
if ( session.get("_prev_uri_") == null )
{
HttpServletRequest request = (HttpServletRequest) context
.get(HTTP_REQUEST);
StringBuffer uri = new StringBuffer(namespace);
uri.append('/');
uri.append(action);
uri.append(ACTION_EXT); // .action, read dynamically from
struts.properties in the init() method
if ( request.getQueryString() != null )
{
uri.append('?');
uri.append(request.getQueryString());
}
session.put("_prev_uri_", uri.toString());
}
return "login";
}
return invocation.invoke();
}
In the doLogin action:
public String doLogin() throws Exception
{
boolean validUser = false;
// validate the user
// etc...
if ( !validUser )
{
addActionError("Authentication failed. Invalid
username/password provided.");
return INPUT;
}
// valid user
session.put("user", userName);
redirectUri = (String) session.get("_prev_uri_");
session.remove("_prev_uri_");
if ( redirectUri == null )
return "gotohome";
return SUCCESS;
}
And in struts.xml:
<action name="doLogin" class="actions.LoginAction"
method="doLogin">
<result name="input">/jsp/login.jsp</result>
<result name="success" type="redirect">
<param name="parse">true</param>
<param name="location">${redirectUri}</param>
</result>
<result name="gotohome" type="redirect-action">
<param name="actionName">home</param>
<param name="namespace">/home</param>
</result>
</action>
It was not working before, but now I changed the order of interceptors
in my interceptor stack and is working :)
If anyone interested in more details, let me know.
Thanks anyway.
On Feb 12, 2008 2:04 PM, Filipe David Manana <[EMAIL PROTECTED]> wrote:
> Yes I need. Because in the S2 configuration file I have to specify all
> the parameters of the query string one by one.
> In my app, I don't know the name and number of these parameters. So I
> am building a Servlet Redirect Action Result in an interceptor like
> this:
>
> public String intercept(ActionInvocation invocation) throws Exception
> {
> ActionContext context = invocation.getInvocationContext();
> Map session = context.getSession();
> String action = invocation.getProxy().getActionName();
> String namespace = invocation.getProxy().getNamespace();
>
> if ( ( action.equals("login") || action.equals("doLogin") )
> && namespace.equals("/") )
> return invocation.invoke();
>
> Object user = session.get("user");
>
> if ( user == null )
> {
> if ( session.get("_prev_uri_") == null )
> {
> String method = invocation.getProxy().getMethod();
> ServletActionRedirectResult result = new
> ServletActionRedirectResult(namespace, action, method);
>
> Map params = context.getParameters();
> Iterator it = params.entrySet().iterator();
> Map.Entry entry = null;
>
> while ( it.hasNext() )
> {
> entry = (Map.Entry) it.next();
> result.addParameter((String) entry.getKey(), entry.getValue());
> }
>
> session.put("_prev_uri_", result);
> }
> // etc...
>
> I tried using a "redirect" type result in the xml config, and
> appending the query string to the url, but struts2 ignores it. The
> query string was obtained with the HttpServletRequest class. (I was
> logging it and it was correct).
>
> Any suggestion?
>
>
> On Feb 12, 2008 1:54 PM, Dave Newton <[EMAIL PROTECTED]> wrote:
> > Are you sure you need to do it like this? You can use OGNL expressions in
> > your S2 configuration file to do things like set a URL to redirect to etc.
> >
> > Dave
> >
> >
> > --- Filipe David Manana <[EMAIL PROTECTED]> wrote:
> >
> > > Hi,
> > >
> > > I am trying to use an action that returns directly instances of the
> > > Result class, due to the nature of my application where the result is
> > > dynamically decided by some logic.
> > >
> > > My action class method is:
> > >
> > > public Result doLogin() throws Exception
> > > {
> > > // etc...
> > > if ( !validUser )
> > > {
> > > addActionError("Authentication failed. Invalid
> > > username/password provided.");
> > > return new ServletDispatcherResult("/jsp/login.jsp");
> > > }
> > >
> > > // valid user
> > > session.put("user", userName);
> > >
> > > ServletActionRedirectResult result =
> > > (ServletActionRedirectResult) session.get("_prev_uri_");
> > >
> > > if ( result == null )
> > > {
> > > result = new ServletActionRedirectResult("/home", "home",
> > > "execute");
> > > }
> > >
> > > return result;
> > > }
> > >
> > > My struts.xml:
> > >
> > > <action name="doLogin" class="actions.LoginAction" method="doLogin">
> > > </action>
> > >
> > > After executing the action's method I always get a
> > > NullPointerException from ServletActionRedirectResult :S
> > >
> > > exception
> > >
> > > javax.servlet.ServletException: java.lang.NullPointerException
> > >
> > > org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:515)
> > >
> > >
> > org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:419)
> > >
> > >
> > org.apache.struts2.dispatcher.ActionContextCleanUp.doFilter(ActionContextCleanUp.java:99)
> > >
> > > root cause
> > >
> > > java.lang.NullPointerException
> > >
> > >
> > org.apache.struts2.dispatcher.ServletActionRedirectResult.execute(ServletActionRedirectResult.java:184)
> > >
> > >
> > com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:348)
> > >
> > >
> > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:253)
> > >
> > >
> > actions.CaptureLastURIRequestedInterceptor.intercept(CaptureLastURIRequestedInterceptor.java:48)
> > >
> > >
> > com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
> > >
> > >
> > com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
> > >
> > >
> > com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
> > >
> > >
> > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
> > >
> > >
> > org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:50)
> > >
> > > org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:504)
> > >
> > >
> > org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:419)
> > >
> > >
> > org.apache.struts2.dispatcher.ActionContextCleanUp.doFilter(ActionContextCleanUp.java:99)
> > >
> > > Am I missing something?
> > >
> > > cheers
> > >
> > > --
> > > Filipe David Manana,
> > > [EMAIL PROTECTED]
> > >
> > > Obvious facts are like secrets to those not trained to see them.
> > >
> > > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > > For additional commands, e-mail: [EMAIL PROTECTED]
> > >
> > >
> >
> >
>
>
>
> --
> Filipe David Manana,
> [EMAIL PROTECTED]
>
> Obvious facts are like secrets to those not trained to see them.
>
--
Filipe David Manana,
[EMAIL PROTECTED]
Obvious facts are like secrets to those not trained to see them.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]