Struts 2拦截器重定向JSP页面

时间:2012-09-28 20:20:07

标签: redirect struts2 interceptor interceptorstack

使用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

2 个答案:

答案 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时,拦截器将被执行,如果用户未登录,将被重定向到登录页面。