Interceptor阻止URL参数传递给操作

时间:2012-10-29 19:09:09

标签: struts2 interceptor

我有一个在大多数操作之前运行的LoginInterceptor,并检查该成员是否已登录。如果是,则显示页面,否则重定向到登录页面。

但是我只是注意到拦截器“阻止”所有URL参数。基本上,如果在操作之前存在拦截器,则此操作的URL参数将不会传递给setter。

这是我的拦截器:

public class LoginInterceptor extends AbstractInterceptor {
    public String intercept(final ActionInvocation invocation) throws Exception {
        final String REDIR = "loginRedirect";
        AuthenticationService auth = new AuthenticationService();
        if (auth.isMemberLoggedIn()) {
            return invocation.invoke();
        } else {
            return REDIR;
        }
    }
}

我怀疑invocation.invoke()会调用该操作,但没有参数。

我该怎么办?

更新:

AuthenticationService.isMemberLoggedIn()

public boolean isMemberLoggedIn() {
    Map<String, Object> session = ActionContext.getContext().getSession();
    String username = (String) session.get("username");
    if (username != null) {
        return true;
    } else {
        return false;
    }
}

struts.xml中

<package name="global" extends="struts-default">
    <interceptors>
        <interceptor name="loginInterceptor" class="community.interceptor.LoginInterceptor" />
    </interceptors>
    <global-results>
        <result name="loginRedirect" type="redirect">/members/login</result>
    </global-results>
</package>

然后每个包扩展global并在每个操作中调用它们:

<interceptor-ref name="loginInterceptor" />

1 个答案:

答案 0 :(得分:6)

如果您的拦截器堆栈不包含params拦截器,则会出现此问题。您应该按照以下方式配置堆栈:

       <interceptors>
           <interceptor name="loginInterceptor" class="community.interceptor.LoginInterceptor" />
           <interceptor-stack name="customDefaultStack">
                <interceptor-ref name="i18n"/>
                <interceptor-ref name="loginInterceptor"/>
                <interceptor-ref name="prepare"/>
                <interceptor-ref name="modelDriven"/>
                <interceptor-ref name="fileUpload"/>
                <interceptor-ref name="checkbox"/>
                <interceptor-ref name="multiselect"/>
                <interceptor-ref name="params">
                    <param name="excludeParams">dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*</param>
                </interceptor-ref>
                <interceptor-ref name="conversionError"/>
                <interceptor-ref name="validation">
                    <param name="excludeMethods">input,back,cancel,browse</param>
                </interceptor-ref>
                <interceptor-ref name="workflow">
                    <param name="excludeMethods">input,back,cancel,browse</param>
                </interceptor-ref>
            </interceptor-stack>
        </interceptors>

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

或者,您可以扩展开箱即用的堆栈:

       <interceptors>
           <interceptor name="loginInterceptor" class="community.interceptor.LoginInterceptor" />
           <interceptor-stack name="customDefaultStack">
                <interceptor-ref name="loginInterceptor"/>
                <interceptor-ref name="defaultStack"/>
            </interceptor-stack>
        </interceptors>

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