2013-09-24 2 views
1

У меня есть пользовательский перехватчик (TransferInterceptor), который проверяет изменение функции в моем приложении. Когда он изменяется, перехватчик возвращает строку после обработки (результат), содержащую глобальное имя результатов действия, к которому я хочу перенаправить. У меня есть результаты, определенные в глобальных результатах моего файла struts.xml, но они не перенаправляются на указанное действие. У меня есть глобальный результат 'Login', который работает хорошо, но она вызывается из JSP с:struts2 глобальный результат не перенаправляется на действие

<s:a action="Login.action">Login</s:a> 

struts.xml файл:

<package name="default" extends="struts-default" namespace="/"> 
    <interceptors> 
     <interceptor name="AuthenticationInterceptor" class="com.purchasing.utils.AuthenticationInterceptor" /> 
     <interceptor name="TransferInterceptor" class="com.purchasing.utils.TransferInterceptor" /> 
     <interceptor-stack name="secureStack"> 
      <interceptor-ref name="TransferInterceptor" /> 
      <interceptor-ref name="AuthenticationInterceptor" /> 
      <interceptor-ref name="defaultStack" /> 
     </interceptor-stack> 
    </interceptors> 

    <default-interceptor-ref name="secureStack" /> 

    <global-results> 
     <result name="Login">login.jsp</result> 
     <result name="RESULTA" type="redirect">ACTIONA</result> 
     <result name="RESULTB" type="redirect">ACTIONB</result> 
    </global-results> 

    <action name="Login" class="com.purchasing.actions.Login"> 
     <interceptor-ref name="defaultStack"></interceptor-ref> 
     <result name="success">welcome.jsp</result> 
     <result name="error">login.jsp</result> 
     <result name="input">login.jsp</result> 
    </action> 

    <action name="ACTIONA" class="com.purchasing.actions.ACTIONA"> 
     <result name="success">ACTIONA.jsp</result> 
     <result name="error">ACTIONA.jsp</result> 
     <result name="input">ACTIONA.jsp</result> 
    </action> 

    <action name="ACTIONB" class="com.purchasing.actions.ACTIONB"> 
     <result name="success">ACTIONB.jsp</result> 
     <result name="error">ACTIONB.jsp</result> 
     <result name="input">ACTIONB.jsp</result> 
    </action>     

</package> 

TransferInterceptor:

public String intercept(ActionInvocation ai) throws Exception 
{ 
    String result = ai.invoke(); 

    session = ai.getInvocationContext().getSession(); 
    fl = (FunctionLine) session.get(Constants.FUNCTION_LINE); 
    function = fl.getFl_function(); 
    last_function = (Integer) session.get(Constants.LAST_FUNCTION); 

    if (function != last_function) { 
     session.put(Constants.LAST_FUNCTION, new Integer(function)); 
     switch (function) { 
       case 61: return "RESULTA"; 
       case 62: return "RESULTB"; 
     } 
     return "error"; 
    } 
    else { 
     return result; 
    } 
} 

Любая помощь будет принята с благодарностью!

+2

Если вы хотите перенаправить к действию, используйте тип результата «redirectAction» вместо «redirect», который используется для перенаправления на статические ресурсы. –

+0

Это ответ @LukaszLenart, вы должны его опубликовать :) –

+0

Я изменил тип = «перенаправить» на type = «redirectAction», и у меня все еще есть та же проблема. – joep

ответ

2

По @Lukasz комментарий:

If you want to redirect to an action use redirectAction result type instead of redirect which is used to redirect to static resources

Он по-прежнему не будет работать, потому что ACTIONB & ACTIONA никогда не выполняет, так как они идут через тот же стек перехватчика, который возвратил redirectAction результат &, следовательно, это любопытное застряло в бесконечном цикле.