3

使用 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.jspJSP 和/WEB-INF/content/login.jspmypackage.LoginAction.java类。主页没有动作类

问题是,当我转到该/homepage页面时,它没有被重定向到login.jsp并且我看到了homepage.jsp内容。怎么了?

PS:我使用 struts2-convention-plugin

4

2 回答 2

2

发生这种情况是因为约定插件使用“约定默认”包,它不知道您的拦截器或拦截器堆栈。

如果您可以创建一个扩展约定的包,默认执行您的拦截器堆栈所做的事情(定义拦截器,拦截器堆栈并定义默认结果类型),然后使约定插件将该堆栈应用为所有操作的默认值不会那太好了?你可以。

<struts>标记之后定义一个常量,如下所示:

<constant name="struts.convention.default.parent.package" value="loginInterceptor"/>

另一个建议是使用 struts.xml 来覆盖约定,这很好,但有点冗长。

另一种选择是使用父包注释,这在您需要覆盖默认行为时很好,但正如您指出的那样,您希望是默认行为,因此您应该保留注释以覆盖它,而不是实现它。

将来可能值得浏览以下 struts2 约定插件常量列表:http: //struts.apache.org/2.1.8/docs/convention-plugin.html#ConventionPlugin-Overwritingpluginclasses

PS:只是命名偏好,但我会调用你的包 login-package 而不是 loginInterceptor ......没什么大不了的。

于 2012-10-02T23:37:51.520 回答
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,拦截器将被执行,如果用户未登录,将被重定向到登录页面。

于 2012-09-28T22:59:26.113 回答