重定向到struts 2中拦截器中的另一个动作

时间:2010-06-08 17:46:33

标签: login struts2 interceptor

我目前正在学习Struts 2,目前我正在构建一个简单的应用程序,将未经验证的用户重定向到登录表单。

我有一个登录表单和操作功能,它获取用户凭据,验证它们并在会话中存储User对象但是我现在正试图阻止在登录之前访问页面并且我正在尝试这样做用拦截器。

我的问题是我编写了一个拦截器,用于检查User对象是否已保存在会话中,但如果没有,我想重定向到登录页面,并且无法绕过struts找不到任何方法并使用HttpServletResponse.sendRedirect方法

配置:

<package name="mypackage" extends="struts-default" namespace="/admin">

    <interceptors>
        <interceptor name="login" class="my.LoginInterceptor" />
    </interceptors>

    <default-interceptor-ref name="login"/>

    <action name="login" class="my.LoginAction">
        <result name="input">/admin/login.jsp</result>
        <result name="success" type="redirect">/admin</result>
    </action>

    <action name="private" class="my.PrivateAction">
        <result>/admin/private.jsp</result>
    </action>

</package>

拦截器代码:

@Override
public String intercept(ActionInvocation inv) throws Exception {

    Map<String, Object> session = inv.getInvocationContext().getSession();

    Object user = session.get("user");
    if(user == null) {

                      // redirect to the 'login' action here            

    }
    else {
        return inv.invoke();
    }

}

3 个答案:

答案 0 :(得分:18)

标准方法是返回一个特殊的全局结果(例如“ login ”)并定义从该结果到admin/login.jsp的全局映射。所以你必须添加这一行:

if(user == null) {
      return "login";
}

在您的struts.xml

<global-results>
   <result name="login">/admin/login.jsp</result>
</global-results>
顺便说一下,我担心你用你的单个拦截器替换默认的Struts2拦截器堆栈,通常你想你的拦截器添加到堆栈中。例如:

<interceptors>
 <interceptor name="login" class="my.LoginInterceptor" />

 <interceptor-stack name="stack-with-login">
  <interceptor-ref name="login"/>
  <interceptor-ref name="defaultStack"/>
 </interceptor-stack>
</interceptors>
<default-interceptor-ref name="stack-with-login"/>

BTW2:当然,您不能将拦截器应用于您的登录操作。

答案 1 :(得分:2)

您可以在此处找到带有自定义登录拦截器的struts2的完整示例

http://sandeepbhardwaj.github.io/2010/12/01/struts2-with-login-interceptor.html

很棒的教程。

答案 2 :(得分:0)

如果您需要使用send redirect,请返回null以避免此问题(例如从www.domain.com重定向到domain.com):

public String intercept(final ActionInvocation invocation) throws Exception {

    String url=RequestUtil.getURLWithParams();  //you should implement this
    int index=url.indexOf("www");
    if (index!=-1 && index<10) {
        //Note: <10 to check that the www is in the domain main url
        //https://localhost:8443/mycontext/myaction.action?oneparam=http://www.youtube.com/user/someuser
        String redirection=url.replaceFirst("www\\.", ""); 
        LOG.debug("Redirection from "+url+" to "+redirection);
        RequestUtil.getResponse().setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
        RequestUtil.getResponse().sendRedirect(redirection);
        return null;
    }
    return invocation.invoke();
}