6
votes

Comment effectuer une opération juste avant la déconnexion au printemps?

Tout d'abord, ce n'est pas une question en double que j'ai vérifié réponses ici ! et ici ! mais ne pouvait pas le faire fonctionner.

aussi je veux y jouer juste avant la déconnexion afin que vous ne puissiez pas utiliser LogouSuccesshandler. P>

Donc, j'ai besoin de créer un logout_filter personnalisé, avec lequel je suis vraiment difficile à obtenir Pour travailler. P>

Voici mon XML de sécurité Spring-Security dans lequel j'ai essayé deux méthodes premier était: - p> xxx pré>

mais cela me donne une erreur p> xxx pré>

alors j'ai essayé. P>

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.filterChains': Cannot resolve reference to bean 'org.springframework.security.web.DefaultSecurityFilterChain#48' while setting bean property 'sourceList' with key [48]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.web.DefaultSecurityFilterChain#48': Cannot create inner bean '(inner bean)' of type [org.springframework.security.web.access.ExceptionTranslationFilter] while setting constructor argument with key [6]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#181': Could not resolve matching constructor (hint: specify index/type/name arguments for simple parameters to avoid type ambiguities)


5 commentaires

Décrivez ce que vous voulez aussi, je doute que vous ayez besoin d'un filtre de déconnexion personnalisé car il peut probablement être effectué avec un logouthandler qui est ajouté à la chaîne d'autres logutandler s. Mais comme vous ne dites pas ce que vous voulez atteindre (fonctionnellement), il est difficile de dire.


@ M.Deinum Je souhaite réellement effectuer une opération sur les données de la session lorsque la session est sur le point de détruire. J'espère que c'est clair maintenant


Ensuite, écrivez simplement un applicatiflistener qui répertorie pour httpsandlestroyedevent s. Enregistrez également le httpsessionEventPublisher à votre web.xml. De cette façon, vous serez également en mesure de traiter des sessions que le temps écoulé au lieu de seulement la déconnexion régulière.


Mais je pense que mon auditeur sera dirigé après la détruite de la session et je ne pourrai plus accéder à la session..Correct moi si je me trompe


Vous avez tort ... il sera appelé pendant la destruction de la session ... Voir ma réponse ...


3 Réponses :


1
votes

Si vous devez exécuter une certaine opération juste avant la déconnexion, je suppose que les intercepteurs de printemps peuvent vous aider.

Vous pouvez implémenter une classe comme celle-ci: P>

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/logout" />
        <bean class="your.app.JustBeforeLogoutInterceptor" />
    </mvc:interceptor>
</mvc:interceptors>


2 commentaires

Cela semble une meilleure solution :)


Merci @DAVIOOOOH mais Méthode de déconnexion de SecurityContextLogOrdler est appelé même avant l'intercepteur .. Donc, au moment où il atteint l'intercepteur, la session est en fait déjà détruite ..



0
votes

Vous pouvez essayer d'étendre le logoutTfilter actuel et d'exécuter votre logique personnalisée avant d'appeler la méthode DOFILTER de Super Class.

J'aime ce p> xxx pré>

alors vous devez remplacer Logoutfilter par défaut avec votre personnaliséLogoutfilter P>

<http>
    <custom-filter position="LOGOUT_FILTER" ref="customLogoutFilter" />
</http>

<bean id="customLogutFilter" class="example.CustomLogoutFilter">
    <property name="filterProcessesUrl" value="/logout" />
    <!-- Put other needed properties here-->
</bean>


2 commentaires

thats ce que j'ai fait si vous voyez ma question .. Crée un gestionnaire de déconnexion myLogouthadler et je suis confronté à une erreur.


Dans votre question, vous remplissez simplement le filtre par défaut avec une implémentation de filtre par défaut avec différentes propriétés. Ce que je suggère de mettre en œuvre votre propre logoutfilter basé sur la mise en œuvre du filtre de déconnexion par défaut. L'erreur que vous avez confrontée étrange et indique un problème d'espace de noms qui est probablement un problème de syntaxe dans votre configuration XML. Pouvez-vous s'il vous plaît ajouter votre configuration XML dans votre question. // En outre, vous pouvez essayer la solution de Davioooh, il semble vraiment mieux.



2
votes

En fonction de votre clarification, ce que vous voulez, c'est d'accéder à la session et d'effectuer une certaine logique. Au lieu de pirater avec un Logoutfilter CODE> Ecrire simplement un ApplicationListener CODE> qui écoute httpessessiondestroyedevent code> s.

<listener>
    <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
</listener>


5 commentaires

J'ai essayé cette méthode et il a entraîné la même manière que l'Interceptor..logout la méthode de SecurityContextLogouthandler est appelée même avant que l'auditeur détruit déjà la session ....


Non, ce n'est pas comme la session est toujours là car elle s'appelle pendant la destruction. Les paramètres et les contextes de sécurité sont toujours là. Assurez-vous également que vous avez enregistré l'auditeur (sinon cela ne fonctionnera pas). Qu'est-ce que tu veux faire de la session quand même?


oui je l'ai inscrit et c'est appelé bien .. J'ai une session Scoped Bean et je mets des données sur Bean lorsque l'utilisateur se connecte et que vous souhaitez simplement effectuer une opération sur ces données lorsque l'utilisateur se déconnecte.


Et le problème que vous avez est? S'il s'agit d'une session SPOPED Bean comme définissant le ressort DIN, alors l'injectez simplement dans votre auditeur ...


A donné un essai à nouveau et cela a fonctionné cette fois .. pense que j'ai manqué quelque chose la dernière fois .. Merci beaucoup @m. Deinum pour une solution simple et élégante.