Перенаправление входа после аутентификации с использованием перехватчиков в Struts 2

У меня есть страница входа. Запросы на вход могут исходить от нескольких классов действий. После проверки пользователя я должен перенаправить его к предыдущему классу действий (от которого пришел запрос на вход). Я использую перехватчики для этого. Но я что-то пропустил, и он не может правильно перенаправить.

Вот мой код:

public class SetTargetInterceptor extends MethodFilterInterceptor implements
    Interceptor {
private static final long serialVersionUID = 1L;

public String doIntercept(ActionInvocation invocation) throws Exception {
    Object action = invocation.getAction();
    HttpServletRequest request = (HttpServletRequest) invocation
            .getInvocationContext().get(StrutsStatics.HTTP_REQUEST);
    if (action instanceof TargetAware) {
        TargetAware targetAwareAction = (TargetAware) action;
        if (targetAwareAction.getTarget() == null)
            targetAwareAction.setTarget(getCurrentUri(request));
    }
    return invocation.invoke();
}

private static String getCurrentUri(HttpServletRequest request) {
    String uri = request.getRequestURI();
    String[] arr = org.apache.commons.lang3.StringUtils.split(uri, "/");
    for (int i = 0; i < arr.length; i++) {
        System.out.println(arr[i]);
    }
    if (arr != null && arr.length > 0) {
        int len = arr.length;
        uri = arr[len - 1];
    }

    String queryString = request.getQueryString();

    if (queryString != null && !queryString.equals(""))
        uri += "?" + queryString;
    return uri;

}

public void init() { /* do nothing */
}

public void destroy() { /* do nothing */
}

Мой struts.xml:

<interceptors>  
<interceptor name="setTargetInterceptor" 
class="com.markEffy.aggregator.interceptors.SetTargetInterceptor"></interceptor>

     <interceptor-stack name="newStack">
        <interceptor-ref name="setTargetInterceptor"/>
    <interceptor-ref name="defaultStack" />
      </interceptor-stack>

</interceptors>
 <action name="login" 
        class="com.markEffy.aggregator.web.LoginAction" 
        method="login">
  <result name="success"  type="redirect">
  <param name="location">${target}</param>
  <param name="parse">true</param>
   </result>
 <action name="reload" 
        class="com.markEffy.aggregator.web.PathFinderAction" 
        method="execute">
         <interceptor-ref name="newStack"/>
        <result name="success">/results.jsp</result>
  </action>

PathFinderAction может запросить логин. loginAction используется для проверки пользователя.


person user3443612    schedule 08.03.2015    source источник


Ответы (1)


У вас отсутствует глобальный результат, который будет использовать динамический параметр для URL-адреса вашего целевого действия.

<global-results>
    <result name="return" type="redirect">${target}</result>
</global-results> 

Вы можете вернуть этот результат из перехватчика или из действия, реализующего TargertAware. Свойство target должно иметь геттер, который будет вызываться результатом.

person Roman C    schedule 08.03.2015
comment
Сэр, я добавил глобальные результаты, но они не работают должным образом. Цель нулевая. Я определил интерфейс TargetAware. Он имеет функции getTarget() и setTarget(). Класс действия, реализующий TargetAware, имеет this.target=target в установщике и возвращает цель в геттере. - person user3443612; 09.03.2015
comment
Оно не должно быть нулевым, если вы определили значение и имеете геттер с именем, используемым выражением. - person Roman C; 11.06.2015