Как выполнить действие перед загрузкой страницы в Struts2? - PullRequest
0 голосов
/ 04 февраля 2012

Я получил проект Java Webapp, который использует Struts2 в качестве уровня контроллера.Мне нужно проверить права пользователя, прежде чем делать что-либо (например, открыть веб-страницу).Я разработал систему авторизации, которую необходимо выполнить при выполнении распорок.Итак, как можно выполнить это действие перед загрузкой страницы?Должен ли я использовать перехватчики?

Ответы [ 2 ]

4 голосов
/ 04 февраля 2012

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

Вы должны всегда указывать на URL-адрес, сопоставленный сервлету / фильтру Struts.Затем сервлет вызывает соответствующее действие, основываясь на URL-адресе, действие возвращает результат (JSP, на который нужно перейти) и переходит к этому JSP.

Если вы указываете непосредственно на JSP,в обход Struts полностью.Читать http://www.javaworld.com/javaworld/jw-12-1999/jw-12-ssj-jspmvc.html

4 голосов
/ 04 февраля 2012

Безусловно, вы должны реализовать свой собственный перехватчик и поместить его поверх других перехватчиков (необязательно сверху). Если вы поместите его поверх, он будет работать до выполнения вашей страницы и может изменить ваше возвращаемое значение.

Например:

В твоих Struts.xml

<interceptor name="security"
    class="com.solekia.common.SecurityInterceptor">
</interceptor>

<interceptor-stack name="defaultStack">
    <interceptor-ref name="security"/>
    <interceptor-ref name="exception" />
...
</interceptor-stack>

<global-results>
    <result name="login" type="redirectAction">Login</result>
    <result name="adminlogin" type="redirectAction">AdminLogin</result>
    <result name="error">/error.jsp</result>
</global-results>

Ваш перехватчик:

public class SecurityInterceptor extends AbstractInterceptor
{
    public static final String CURRENT_USER = "current_user";
    public static final String LOGIN = "login";
    public static final String ADMINLOGIN = "adminlogin";

    public String intercept(ActionInvocation invocation) throws Exception {

        Object user = invocation.getInvocationContext().getSession().get(CURRENT_USER); 
        Object action = invocation.getAction();

        if(action instanceof Login)
        {
            return invocation.invoke();
        }
        else if(action instanceof Register)
        {
            return invocation.invoke();
        }
        else if(action instanceof Pro)
        {
            return invocation.invoke();
        }

        if( user == null )
        {
            invocation.getInvocationContext().getSession().clear();
            return LOGIN;
        }
        else
        {
            if(user instanceof User)
            {
                if(action instanceof AdminLogin)
                    return ADMINLOGIN;
            }

            if(user instanceof Admin)
            {
                if(action instanceof ClientPortal)
                    return LOGIN;
            }           

            synchronized(user)
            {           
                return invokeLocal(invocation) ;
            }
        }
    }

    protected String invokeLocal(ActionInvocation invocation) throws Exception
    {
        return invocation.invoke();     
    }   
}

Надеюсь, это поможет

...