2010-06-08 4 views
10

Je suis actuellement en train d'apprendre Struts 2 et je suis en train de construire une application simple où les utilisateurs non vérifiés sont redirigés vers un formulaire de connexion.Rediriger vers une autre action dans un intercepteur dans struts 2

J'ai un formulaire de connexion et d'action fonctionnelle qui prend les informations d'identification des utilisateurs, les vérifie et stocke un objet Utilisateur dans la session mais j'essaie maintenant d'empêcher l'accès aux pages avant que la connexion ne se fasse. ceci avec un intercepteur. Mon problème est que j'ai écrit un intercepteur qui vérifie si l'objet Utilisateur a été enregistré dans la session mais si ce n'est pas le cas, je veux rediriger vers la page de connexion et je ne trouve aucun moyen de le faire sans contourner des entretoises et en utilisant la méthode de HttpServletResponse.sendRedirect

Configuration:

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

le code d'interception:

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

} 

Répondre

18

T La méthode standard consiste à renvoyer un résultat global spécial (par exemple, "login") et de définir un mappage global à partir de ce résultat vers votre admin/login.jsp. Donc, vous devez simplement ajouter cette ligne:

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

Et dans votre struts.xml:

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

BTW, je crains que vous remplacez la valeur par défaut Struts2 pile intercepteur avec votre seul intercepteur, normalement vous voulez à ajoutez votre intercepteur à la pile. Par exemple:

<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: Vous ne devez pas appliquer l'intercepteur à votre action de connexion, bien sûr.

+0

Merci, et merci supplémentaires pour les conseils bonus. Comment pourrais-je empêcher l'intercepteur d'attraper l'action de connexion? – 3urdoch

+2

En fait, j'ai travaillé pour moi-même, je viens de mettre dans l'action de connexion. – 3urdoch

+0

Oui, c'est un moyen. – leonbloy

0

Si vous avez besoin d'utiliser la redirection d'envoi, return null pour éviter ce problème (par exemple la réorientation de 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(); 
} 
Questions connexes