La déconnexion laisse derrière JSESSIONID sur le navigateur. Comment le vider?
J'utilise le code suivant pour la connexion d'un utilisateur hors de mon système.
/**
* This function helps to set the session attribute for the present user to null and then
* removes the attribute itself and this helps in clearing the session
* @param request
* @param response
*/
@RequestMapping(value = AuthConstants.EXIT, method = RequestMethod.POST)
public void exitPrime(HttpServletRequest request, HttpServletResponse response) {
/*Getting session and then invalidating it*/
HttpSession session = request.getSession(false);
if(request.isRequestedSessionIdValid() && session != null)
{
session.invalidate();
}
}
Cela conduit à une déconnexion réussie mais le JSESSION IDENTIFIANT donné par le moment de la connexion en reste encore dans le navigateur en raison de laquelle pour tout nouvel utilisateur de la même JSESSION ID est de nouveau utilisé lors de la connexion. Je veux que le cookie JSESSIONID être valide que pour la session en cours et une fois que l'utilisateur se déconnecte, il doit être détruit ou non valide pour la connexion fait pour la prochaine fois. Mon nom de Code est comme suit :-
/**
* This method allows one to log into the system and generates a token for a valid employee.
* @param authRequest
* @param request
* @param response
* @return
*/
@RequestMapping(value = AuthConstants.ENTRY, method = RequestMethod.POST, consumes = ApplicationConstants.APPLICATION_JSON)
public @ResponseBody
AuthResponse primeEntry(@RequestBody AuthRequest authRequest,HttpServletRequest request, HttpServletResponse response) {
AuthResponse authResponse = new AuthResponse();
if(authRequest != null && authRequest.getEmployeeAuth().getEmployeeNumber() != null
&& !authRequest.getEmployeeAuth().getEmployeeNumber().isEmpty()){
/*To check whether the user is valid*/
String employeeNumber = authRequest.getEmployeeAuth().getEmployeeNumber();
UserBean userBean = new UserBean();
userBean = userService.getUser(employeeNumber);
if(userBean != null)
{
HttpSession session = request.getSession(true);
session.setAttribute("user", userBean);
setAuthResponseSuccess(authResponse);
}else{
/*If user does not exist the too throw error 500*/
setAuthResponseFailure(authResponse);
}
}else{
/*If input JSON is not valid then throw error 500*/
setAuthResponseFailure(authResponse);
}
return authResponse;
}
Je suis à l'aide de Printemps 3.2 et souhaitez faire de Connexion et de Déconnexion Manuellement. S'Il Vous Plaît Aider.
Complet De La Classe Code
@Controller
@RequestMapping(value = "/auth")
public class AuthController {
@Autowired
HttpServletRequest request;
@Autowired
HttpSession session;
@Autowired
IUserService userService;
/**
* This method allows one to log into the system and generates a token for a valid employee.
* @param authRequest
* @param request
* @param response
* @return
*/
@RequestMapping(value = AuthConstants.ENTRY, method = RequestMethod.POST, consumes = ApplicationConstants.APPLICATION_JSON)
public @ResponseBody
AuthResponse primeEntry(@RequestBody AuthRequest authRequest,HttpServletRequest request, HttpServletResponse response) {
AuthResponse authResponse = new AuthResponse();
if(authRequest != null && authRequest.getEmployeeAuth().getEmployeeNumber() != null
&& !authRequest.getEmployeeAuth().getEmployeeNumber().isEmpty()){
/*To check whether the user is valid*/
String employeeNumber = authRequest.getEmployeeAuth().getEmployeeNumber();
UserBean userBean = new UserBean();
userBean = userService.getUser(employeeNumber);
if(userBean != null)
{
HttpSession session = request.getSession(true);
session.setAttribute("user", userBean);
setAuthResponseSuccess(authResponse);
}else{
/*If user does not exist the too throw error 500*/
setAuthResponseFailure(authResponse);
}
}else{
/*If input JSON is not valid then throw error 500*/
setAuthResponseFailure(authResponse);
}
return authResponse;
}
/**
* This function helps to set the session attribute for the present user to null and then
* removes the attribute itself and this helps in clearing the session
* @param request
* @param response
*/
@RequestMapping(value = AuthConstants.EXIT, method = RequestMethod.POST)
public void exitPrime(HttpServletRequest request, HttpServletResponse response) {
/*Getting session and then invalidating it*/
HttpSession session = request.getSession(false);
if(request.isRequestedSessionIdValid() && session != null)
{
session.invalidate();
}
}
private AuthResponse setAuthResponseFailure(AuthResponse authResponse) {
authResponse.setResponseCode(ApplicationConstants.INTERNAL_ERROR_CODE);
authResponse.setStatus(StatusType.FAILURE);
authResponse.setResponseMsg(ApplicationConstants.INTERNAL_ERROR_MESSAGE);
return authResponse;
}
private AuthResponse setAuthResponseSuccess(AuthResponse authResponse){
authResponse.setResponseCode(ApplicationConstants.OK);
authResponse.setStatus(StatusType.SUCCESS);
authResponse.setResponseMsg(ApplicationConstants.LOGIN_SUCCESS);
return authResponse;
}
}
source d'informationauteur Shiv Kumar Ganesh
Vous devez vous connecter pour publier un commentaire.
Il n'y a rien de mal avec JSESSIONID restes sur votre navigateur, tant que c'est déjà pas valide. JSESSIONID est juste un tas de caractères aléatoires qui ne contiennent pas de vos données réelles.
Cependant, je pensez que votre problème est que vous avez utilisé
@SessionAttributes
annotation au niveau de la classe, et que vous avez tentésession.invalidate()
. Avec ce scénario, après la session précédente est invalidé, le Printemps automatiquement crée une nouvelle session (et JSESSIONID) pour vous parce qu'il a persister modèle spécifié attributs dans la session.De l'OMI, une meilleure approche est de créer un nouveau contrôleur qui n'a pas
@SessionAttributes
et invalider votre session à partir de là.Après avoir expérimenté un peu je suis arrivé à la conclusion que, si vous voulez le cookie du navigateur de la valeur à persister alors juste ne pas faire n'importe quoi et le code ci-dessus va fonctionner très bien pour vous. D'autre part, si vous voulez la sortie du cookie quelque chose comme
Set-Cookie: JSESSIONID=""; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/
Alors vous pouvez prendre cet extrait de code, et de l'essayer.
Cela permettrait de résoudre le problème et de détruire le cookie lorsque vous se déconnecter.
Pas sûr si c'est toujours le réel, mais on peut étendre LogoutFilter de ce genre pour spécifier les étapes exactes pour être fait lors de la déconnexion, y compris personnalisés cookies invalidation.
Une façon, je pense à supprimer le
JSESSIONID
cookie lors de la déconnexion de l'action. Le moyen de supprimer le cookie est de définir son âge à zéro comme suit.Ici, j'ai ajouté le chemin en tant que root. Veuillez vérifier
JSESSIONID
cookie dans votre navigateur pour le chemin d'accès correct.Une fois que vous avez cela, l'ajouter à la réponse
Vous pouvez mettre ce code dans votre
exitPrime()
méthode.L'approche énumérés précédemment ne fonctionne pas pour moi, mais avec quelques modifications près, je l'ai eu à travailler, je n'ai fait que des tests limités mais YMMV.
Tomcat ajoute une barre oblique à la fin du chemin de contexte. Maintenant, lorsque vous définissez l'supprimer le cookie de l'attribut, le Printemps essaie de trouver le cookie pour le chemin d'accès sans slash à la fin. Parce qu'il ne le trouve pas, le cookie ne sera pas retiré, ce qui entraîne l'affichage de la fin de la session de page au lieu de la page de connexion.
Solution de contournement suivante fera l'affaire.