我有一个在大多数操作之前运行的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" />
答案 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"/>