那就是它,我编写一个拦截器登录,结果是
<result name="login" type="redirectAction">access</result>
,一切正常,但我认为这是回忆它;结果去访问并再次执行拦截器并进入访问等。我相信因为我的浏览器显示消息:
页面未正确重定向。
我正在使用Struts2和Rest插件。
这是我的拦截器:
@Override
public String intercept(ActionInvocation invocation) throws Exception {
HttpSession session = ServletActionContext.getRequest().getSession(false);
Object loginObject = session.getAttribute("login");
boolean login = false;
if (loginObject != null) {
login = (Boolean) loginObject;
if (!login) {
return Action.LOGIN;
} else {
return invocation.invoke();
}
} else {
return Action.LOGIN;
}
答案 0 :(得分:2)
扩展罗马的评论:将会话值设置为true
以及为什么它是多余的:
不要检查会话值的值,只需检查其存在。在注销时,显式删除会话对象(如果您需要保留其他会话数据)或使会话无效。
这样可以将代码减少到大约这样:
public String intercept(ActionInvocation invocation) throws Exception {
Map session = invocation.getInvocationContext().getSession()
Object loginObject = session.getAttribute("login");
if (loginObject == null) {
return LOGIN;
}
return invocation.invoke();
}
关于getSession(false)
,通常不需要包含boolean参数,因为JSP页面将自动创建会话,除非明确声明不是。
答案 1 :(得分:1)
当您从Interceptor中返回Action.LOGIN时,将执行结果,并且由于结果类型为redirectAction
,因此会创建另一个请求并通过Interceptor Stack进行过滤。然后执行将再次触发你的拦截器,这是不想要的结果。
例如,您需要使用默认堆栈排除access
操作的登录拦截器的执行。
<default-interceptor-ref name="myCustomLoginStack"/>
<action name="access" class="foo.bar.actions.Access">
<result>access.jsp</result>
<interceptor-ref name="defaultStack" />
</action>
<action name="foobar" class="foo.bar.actions.Foobar">
<result>foo.jsp</result>
<result name="login" type="redirectAction">access</result>
</action>
答案 2 :(得分:1)
login
或access
都未将loginObject
设置为会话,也未将其设置为true
,这是多余的。因此,如果将此拦截器配置为该操作,则会阻止操作调用和执行。