如何在Struts2中加载页面之前执行操作?

时间:2012-02-04 08:33:14

标签: java struts2 interceptor

我有一个Java Webapp项目,它使用Struts2作为控制器层。我需要在做任何事情之前检查用户的权限(比如打开网页)。我开发了一个需要在struts动作中执行的授权系统。那么,如何在加载页面之前执行此操作呢?我应该使用拦截器吗?

2 个答案:

答案 0 :(得分:4)

当然,您应该实现自己的拦截器并将其置于其他拦截器之上(不一定在顶部)。如果你把它放在最前面,它可以在你的页面执行之前工作,并且可以改变你的返回值。

例如:

在你的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();     
    }   
}

希望这有帮助

答案 1 :(得分:4)

你无法理解像Struts这样的MVC框架的全部意义。在MVC应用程序中,您应该从不具有指向JSP的任何链接或表单。

您应始终指向映射到Struts servlet / filter的URL。然后servlet根据URL调用相应的操作,操作返回结果(要转到的JSP),Struts转发到此JSP。

如果直接指向JSP,那么您完全绕过Struts。阅读http://www.javaworld.com/javaworld/jw-12-1999/jw-12-ssj-jspmvc.html