2010-06-08 21 views
10

Actualmente estoy en el proceso de aprendizaje Struts 2 y actualmente estoy construyendo una sencilla aplicación donde los usuarios no verificados son redirigidos a un formulario de acceso.redirigir a otra acción en un interceptor de puntales 2

Tengo un formulario de inicio de sesión y una acción funcional que toma las credenciales de los usuarios, las verifica y almacena un objeto de usuario en la sesión, pero ahora intento evitar el acceso a las páginas antes de iniciar sesión y estoy intentando hacer esto con un interceptor.

Mi problema es que he escrito un interceptor que comprueba si el objeto Usuario ha sido guardado en la sesión pero si no lo ha hecho, quiero redireccionar a la página de inicio de sesión y no puedo encontrar ninguna forma de hacerlo sin omitir puntales y utilizando el método HttpServletResponse.sendRedirect

Configuración:

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

el código interceptor:

@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(); 
    } 

} 

Respuesta

18

T que forma estándar es devolver un resultado global especial (por ejemplo, " de inicio de sesión") y definir un mapa global de ese resultado a su admin/login.jsp. Por lo que sólo debe añadir esta línea:

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

Y en su struts.xml:

<global-results> 
    <result name="login">/admin/login.jsp</result> 
</global-results> 

Por cierto, me temo que va a sustituir la pila Struts2 interceptor por defecto con su sola interceptor, normalmente desea a añadir su interceptor a la pila. Por ejemplo:

<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: Usted no debe aplicar el interceptor a su acción de acceso, por supuesto.

+0

Gracias, y gracias extra para la orientación de bonificación. ¿Cómo podría evitar que el interceptor capte la acción de inicio de sesión? – 3urdoch

+2

En realidad, trabajé eso por mi mismo, acabo de poner en la acción de inicio de sesión. – 3urdoch

+0

Sí, esa es una forma. – leonbloy

0

Si es necesario utilizar redirección de envío, devolver null para evitar este problema (ejemplo redireccionamiento desde www.domain.com a 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(); 
} 
Cuestiones relacionadas