【发布时间】:2012-03-05 21:19:06
【问题描述】:
我有一个登录拦截器,它检查会话成员对象,如果它为空,则将其重定向到登录页面,否则继续操作。
每个动作块都有这个拦截器。问题是当你调用动作时它会命中拦截器,如果它是真的继续操作方法,然后返回“成功”或“输入”然后再次命中拦截器以重定向选定的结果名称。
如何防止两次调用拦截器?
拦截器代码:
public String intercept(ActionInvocation actionInvocation) throws Exception {
HttpServletRequest request = (HttpServletRequest) actionInvocation.getInvocationContext().get(StrutsStatics.HTTP_REQUEST);
HttpSession session = request.getSession();
if (session.getAttribute("member")==null) {
return Action.LOGIN;
} else {
return actionInvocation.invoke();
}
}
struts.xml 动作视图:
<action name="actionName" class="actionClass" method="init">
<interceptor-ref name="loginStack"/>
<result name="input">show.jsp</result>
</action>
【问题讨论】:
-
不是特定的操作。拦截器是 com.opensymphony.xwork2.interceptor.Interceptor 的简单实现类
-
你能澄清你的担忧吗?拦截器通常被调用两次,这就是为什么它是一个拦截器堆栈。您向下钻取堆栈调用操作,然后返回堆栈。如果您正在重定向,那么它将再次被调用......但重定向通常是要避免的。整个过程非常快,所以除非有其他事情发生,否则没关系。顺便说一句,您可以说: actionInvocation.getInvocationContext().getSession() 并删除第二行。
-
@Quaternion 它们不是“调用两次”,而是调用一次,然后包装动作执行。我也不知道为什么要避免重定向;那有什么论据?
-
我应该注意我的坏语言,当然他们被称为一次。我不清楚为什么 OP 认为他们被调用了两次,并且可能正在以某种方式跟踪执行并只是看着调用结束。我不知道我为什么这么说重定向......我不喜欢在动作级别重定向它应该在拦截器中,因为它看起来像他正在使用 xml 并且这使得意大利面条 xml(你需要跨多个动作在动作 java 和动作 xml 之间切换以弄清楚发生了什么)我可能完全错了,但我明白了......
-
... 从行 [问题是当你调用动作时它会击中拦截器,如果它是真的继续操作方法,然后返回“成功”或“输入”然后再次击中拦截器重定向该选定的结果名称。] 这对我来说表明如果确实第二次调用拦截器,则该操作正在执行重定向,这就是我所说的重定向通常应该避免的意思(我认为工作流程是拦截器)动作用于编组数据,如果两个动作共享功能,最好通过继承或推送来显示......
标签: java redirect struts2 interceptor