Перенаправление на другое действие в перехватчике в стойках 2 - PullRequest
10 голосов
/ 08 июня 2010

Я сейчас нахожусь в процессе изучения Struts 2, и в настоящее время я создаю простое приложение, в котором непроверенные пользователи перенаправляются в форму входа.

У меня есть форма входа и функционал действия, который принимает учетные данные пользователей, проверяет их и сохраняет объект User в сеансе, однако сейчас я пытаюсь запретить доступ к страницам до входа в систему, и я пытаюсь сделать это с перехватчиком.

Моя проблема в том, что я написал перехватчик, который проверяет, был ли объект User сохранен в сеансе, но если нет, я хочу перенаправить на страницу входа в систему и не могу найти способ сделать это без обхода распорок и используя метод HttpServletResponse.sendRedirect

Конфигурация:

<package name="mypackage" extends="struts-default" namespace="/admin">

    <interceptors>
        <interceptor name="login" class="my.LoginInterceptor" />
    </interceptors>

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

    <action name="login" class="my.LoginAction">
        <result name="input">/admin/login.jsp</result>
        <result name="success" type="redirect">/admin</result>
    </action>

    <action name="private" class="my.PrivateAction">
        <result>/admin/private.jsp</result>
    </action>

</package>

Код перехватчика:

@Override
public String intercept(ActionInvocation inv) throws Exception {

    Map<String, Object> session = inv.getInvocationContext().getSession();

    Object user = session.get("user");
    if(user == null) {

                      // redirect to the 'login' action here            

    }
    else {
        return inv.invoke();
    }

}

Ответы [ 3 ]

18 голосов
/ 08 июня 2010

Стандартный способ - вернуть специальный глобальный результат (например, " login ") и определить глобальное сопоставление этого результата с вашим admin/login.jsp.Так что вы просто должны добавить эту строку:

if(user == null) {
      return "login";
}

И в вашем struts.xml:

<global-results>
   <result name="login">/admin/login.jsp</result>
</global-results>

Кстати, я боюсь, что вы заменяете стек перехватчиков Struts2 по умолчанию своимодин перехватчик, обычно вы хотите добавить ваш перехватчик в стек.Например:

<interceptors>
 <interceptor name="login" class="my.LoginInterceptor" />

 <interceptor-stack name="stack-with-login">
  <interceptor-ref name="login"/>
  <interceptor-ref name="defaultStack"/>
 </interceptor-stack>
</interceptors>
<default-interceptor-ref name="stack-with-login"/>

КСТАТИ 2: Конечно, вы НЕ должны применять перехватчик к действию входа в систему.

2 голосов
/ 14 декабря 2010

Полный пример struts2 с пользовательским перехватчиком входа можно найти здесь

http://sandeepbhardwaj.github.io/2010/12/01/struts2-with-login-interceptor.html

отличный учебник.

0 голосов
/ 03 июля 2014

Если вам нужно использовать перенаправление отправки, верните null, чтобы избежать этой проблемы (пример перенаправления с www.domain.com на domain.com):

public String intercept(final ActionInvocation invocation) throws Exception {

    String url=RequestUtil.getURLWithParams();  //you should implement this
    int index=url.indexOf("www");
    if (index!=-1 && index<10) {
        //Note: <10 to check that the www is in the domain main url
        //https://localhost:8443/mycontext/myaction.action?oneparam=http://www.youtube.com/user/someuser
        String redirection=url.replaceFirst("www\\.", ""); 
        LOG.debug("Redirection from "+url+" to "+redirection);
        RequestUtil.getResponse().setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
        RequestUtil.getResponse().sendRedirect(redirection);
        return null;
    }
    return invocation.invoke();
}
...