2010-06-08 3 views
10

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

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

Моя проблема заключается в том, что я написал перехватчик, который проверяет, был ли сохранен пользовательский объект в сеансе, но если у него нет, я хочу перенаправить на страницу входа и не могу найти способ сделать это без обхода распорки и с использованием метода 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(); 
    } 

} 

ответ

18

Т стандартным способом является возврат специального глобального результата (например, «login») и определение глобального сопоставления из этого результата на ваш admin/login.jsp. Таким образом, вы просто должны добавить следующую строку:

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

и в вашем struts.xml:

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

BTW, я боюсь, что вы заменяете по умолчанию 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"/> 

BTW2: Вы не должны применять перехватчик к действию входа в систему, конечно.

+0

Спасибо, и дополнительные спасибо за бонус руководства. Как я пойду на предотвращение перехватчика от входа в действие входа? – 3urdoch

+2

На самом деле, я работал для себя, я просто поместил в действие входа. – 3urdoch

+0

Да, это один из способов. – leonbloy

0

Если вам нужно использовать посыл редирект, вернуть нуль, чтобы избежать этой проблемы (например, перенаправление из 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(); 
} 
Смежные вопросы