Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Struts2中加载页面之前执行操作?_Java_Struts2_Interceptor - Fatal编程技术网

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

Java 如何在Struts2中加载页面之前执行操作?,java,struts2,interceptor,Java,Struts2,Interceptor,我得到了一个JavaWebApp项目,它使用Struts2作为控制器层。我需要检查用户的权限,然后再做任何事情,如打开网页。我开发了一个需要在struts操作中执行的授权系统。那么,如何在加载页面之前执行此操作呢?我应该使用拦截器吗?当然,您应该实现自己的拦截器,并将其放在其他拦截器的顶部,而不一定放在顶部。如果你把它放在上面,它会在你的页面执行之前工作,并且可以改变你的返回值 例如: 在struts.xml中 <interceptor name="security" class=

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

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

例如:

在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>

希望这有助于您理解Struts等MVC框架的全部要点。在MVC应用程序中,您不应该有任何指向JSP的链接或表单

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


如果直接指向JSP,则完全绕过了Struts。阅读

我不明白你的问题。如果必须在Struts操作中执行,则在Struts操作中执行。问题是什么?看,问题是我想在加载特定页面的任何内容之前执行操作。这可能是一个场景:1-用户进入www.app.com/admin.jsp 2-应该在操作中检查权限3-如果授权,则加载页面,否则会显示错误。@SJ.Jafari:如果您想要实现授权系统,请使用授权框架,如spring security/JAAS等。我想您得到了我:D,实际上,我知道MVC框架的全部要点。问题是,除了使用struts作为表单的控制器外,我没有想到将它们用于链接。无论如何,谢谢你,我得到了我的答案。如果你没有使用struts2约定插件,我强烈建议你看看它。您将应用一个拦截器,它将强制某个文件夹中的所有jsp都将使用它。那么您就不需要任何xml,也不需要一点xml来定义拦截器堆栈。关键是你只需要创建链接而不需要担心动作映射,约定就可以了。谢谢你的回答,但是我犯了一个根本性的错误,直接指向链接。
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();     
    }   
}