Vérifier si la session existe JSF

j'ai une page de connexion où j'ai un utilisateur bean pour authentifier le nom d'utilisateur et le mot de passe pour une personne. Ce haricot est la Session Scoped. Si quelqu'un écrit une URL et tente de sauter la page de connexion, Comment puis-je vérifier cela et le rediriger vers la page de connexion?

d'autre part. Supposons que je me suis connecté et que je travaillais et que tout à coup je sors un moment et que ma session expire. Lorsque je reviens et que j'essaie d'interagir avec le formulaire, un message m'avertit de la session. expiration. Comment puis-je redirecter à nouveau vers le formulaire de connexion lorsque cela se produit?

Merci d'avance. De l'espoir, je m'expliquer.

Mojarra 2.1.4, Tomcat 7, Tomahawk 1.1.11

7
demandé sur BalusC 2011-11-16 02:43:38

2 réponses

si quelqu'un écrit une URL et tente de sauter la page de connexion, Comment puis-je vérifier cela et le rediriger vers la page de connexion?

vous semblez utiliser l'authentification maison. Dans ce cas, vous devez mettre en œuvre un servlet filter . JSF stockes session scoped géré haricots comme attributs de HttpSession , de sorte que vous pouvez juste vérifier que dans doFilter() méthode:

HttpServletRequest req = (HttpServletRequest) request;
UserManager userManager = (UserManager) req.getSession().getAttribute("userManager");

if (userManager != null && userManager.isLoggedIn()) {
    chain.doFilter(request, response);
} else {
    HttpServletResponse res = (HttpServletResponse) response;
    res.sendRedirect(req.getContextPath() + "/login.xhtml");
}

mappez ce filtre sur un motif D'URL couvrant les pages sécurisées, p.ex. /app/* .


lorsque je reviens et que j'essaie d'interagir avec le formulaire, un message m'avertit de l'expiration de la session. Comment puis-je rediriger à nouveau vers le formulaire de connexion lorsque cela se produit?

je comprends que cela concerne les demandes Ajax? Pour les demandes normales vous pourriez ont utilisé un <error-page> dans web.xml . Si vous définissez la méthode de sauvegarde d'état au client dans web.xml comme suit

<context-param>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>client</param-value>
</context-param>

n'est pas une option, alors vous devez mettre en œuvre une ExceptionHandler :

public class ViewExpiredExceptionHandler extends ExceptionHandlerWrapper {

    private ExceptionHandler wrapped;

    public ViewExpiredExceptionHandler(ExceptionHandler wrapped) {
        this.wrapped = wrapped;
    }

    @Override
    public void handle() throws FacesException {
        FacesContext facesContext = FacesContext.getCurrentInstance();

        for (Iterator<ExceptionQueuedEvent> iter = getUnhandledExceptionQueuedEvents().iterator(); iter.hasNext();) {
            Throwable exception = iter.next().getContext().getException();

            if (exception instanceof ViewExpiredException) {
                facesContext.getApplication().getNavigationHandler().handleNavigation(facesContext, null, "viewexpired");
                facesContext.renderResponse();
                iter.remove();
            }
        }

        getWrapped().handle();
    }

    @Override
    public ExceptionHandler getWrapped() {
        return wrapped;
    }

}

(notez que cet exemple particulier navigue sur viewexpired , donc il s'attend à une /viewexpired.xhtml comme page d'erreur)

ce qui précède doit être cuit par ExceptionHandlerFactory mise en œuvre:

public class ViewExpiredExceptionHandlerFactory extends ExceptionHandlerFactory {

    private ExceptionHandlerFactory parent;

    public ViewExpiredExceptionHandlerFactory(ExceptionHandlerFactory parent) {
        this.parent = parent;
    }

    @Override
    public ExceptionHandler getExceptionHandler() {
        return new ViewExpiredExceptionHandler(parent.getExceptionHandler());
    }

}

, qui à son tour doit être enregistrée dans faces-config.xml comme suit:

<factory>
    <exception-handler-factory>com.example.ViewExpiredExceptionHandlerFactory</exception-handler-factory>
</factory>
16
répondu BalusC 2017-05-23 12:10:05

si vous implémentez votre propre système, vous pouvez ajouter un attribut à l'utilisateur appelé session ou autre. Cet attribut peut être booléen ainsi chaque fois que la session commence, vous pouvez définir cet attribut à true. Écrire une méthode appelée permission par exemple:

public void permission() throws IOException {

        if(userStatelessBean.getSession() == false) {
            System.out.println("*** The user has no permission to visit this page. *** ");
            ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
            context.redirect("login.xhtml");
        } else {
            System.out.println("*** The session is still active. User is logged in. *** ");
        }
    }

sur chaque page de votre jsf ( pour cet exemple ) sur laquelle vous voulez avoir des restrictions, vous pouvez ajouter le code suivant au début de votre page:

<f:metadata>
     <f:event type="preRenderView" listener="#{sesija.permission()}"/>
</f:metadata>

ce que cela va faire est d'appeler le JSF ManagedBean avec le nom de l'objet sesija avant de rendre la page et de vérifier si les règles que vous avez créé dans la méthode spécifiée sont satisfaites ou non.

j'espère que vous trouverez cela utile,

Merci.

1
répondu miksiii 2014-11-11 17:03:18