使用Struts 2,我有这个拦截器:
public class AccessInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation ai) throws Exception {
ActionContext actionContext = ai.getInvocationContext();
Map<String, Object> session = actionContext.getSession();
Boolean logged = (Boolean) session.get("logged");
if(logged == null) {
session.put("logged", false);
logged = false;
}
if (!logged) {
// If exception is here, it IS thrown, so I am sure "login" is returned on /homepage
return "login";
}
return ai.invoke();
}
}
这是struts.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<package name="loginInterceptor" namespace="/" extends="struts-default">
<interceptors>
<interceptor name="access"
class="logininterceptor.interceptors.AccessInterceptor"/>
<interceptor-stack name="appDefault">
<interceptor-ref name="access" />
<interceptor-ref name="defaultStack" />
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="appDefault" />
<global-results>
<result name="login">/WEB-INF/content/login.jsp</result>
</global-results>
</package>
</struts>
我还有/WEB-INF/content/homepage.jsp
JSP和/WEB-INF/content/login.jsp
以及mypackage.LoginAction.java
类。主页没有acton课程
问题是,当我转到/homepage
页面时,它不会重定向到login.jsp
,我会看到homepage.jsp
内容。有什么问题?
PS:我使用struts2-convention-plugin
答案 0 :(得分:2)
这种情况正在发生,因为convention插件使用“convention-default”包,它不知道您的拦截器或拦截器堆栈。
如果您可以创建一个扩展约定的包 - 默认执行拦截器堆栈的操作(定义拦截器,拦截器堆栈并定义默认结果类型),然后使用convention插件将该堆栈应用为所有操作的默认值那会不会很棒?你可以。
在<struts>
标记之后定义一个常量:
<constant name="struts.convention.default.parent.package" value="loginInterceptor"/>
另一个建议是使用struts.xml来覆盖约定,这很好但有点冗长。
另一种选择是使用父包注释,这在您需要覆盖默认行为时很好,但是当您指出希望 this 是默认行为时,您应该保留注释压倒这一点,而不是实现它。
可能值得浏览以下struts2约定的插件常量列表:http://struts.apache.org/2.1.8/docs/convention-plugin.html#ConventionPlugin-Overwritingpluginclasses
PS:只是命名首选项,但我会调用你的包登录 - 包而不是loginInterceptor ...没什么大不了的。
答案 1 :(得分:0)
如果你想在每次有人访问homepage.jsp
时强制执行拦截器,那么执行此操作的正确方法是放置一个返回jsp的操作。例如:
<struts>
...
<package name="loginInterceptor" namespace="/" extends="struts-default">
<interceptors>
...
</interceptors>
<default-interceptor-ref name="appDefault" />
<global-results>
...
</global-results>
<action name="homepage">
<result>/WEB-INF/content/homepage.jsp</result>
</action>
</package>
</struts>
之后,当用户尝试访问http://.../homepage.action
时,拦截器将被执行,如果用户未登录,将被重定向到登录页面。