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]

Reply via email to