English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Recentemente, mentre scrivevo un sito web di acquisto, durante il test della funzione di disconnessione, facendo clic sul pulsante di ritorno del browser per aggiornare, ho notato che l'utente che si era disconnesso è stato ricollegato di nuovo
Ho pensato molto e ho cercato molti metodi su Internet, ma la maggior parte dei metodi suggeriti su Internet sono implementati con JavaScript per disabilitare il pulsante di ritorno del browser dopo la disconnessione
Questo metodo è fattibile, ma non risolve veramente il problema in background, ha una sensazione di proteggere i gentili e non i maliziosi
Di seguito, registro il mio metodo implementato
Principio:
Dopo aver disconnesso, fare clic sul pulsante di ritorno del browser per aggiornare il browser è in realtà il browser che invia di nuovo le informazioni del form originale
La disconnessione significa eliminare la sessione originale
// Disconnessione private void logout(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); request.setAttribute("sessionId", session.getId()); session.removeAttribute("user"); session.invalidate(); response.sendRedirect(request.getContextPath() + "/index.jsp"); }
Quando ci si disconnette e si viene reindirizzati a una pagina jsp, la sessione creata è diversa dalla sessione originale (la sessione del jsp è impostata per default come attivata).
Quindi, dopo aver disconnesso, fare clic sul pulsante di ritorno del browser per aggiornare la sessione è una nuova sessione, partendo da questo punto di vista per pensare a una soluzione.
Ho messo un pezzo di dati nella sessione originale, la prima volta che mi collego posso ottenere questi dati, dopo aver disconnesso la sessione originale non esiste più, facendo clic sul pulsante di ritorno del browser per aggiornare, i dati che otteniamo sono null.
Confrontiamo i dati della sessione originale con il nuovo valore di sessione, uno ha un valore e l'altro è null, sicuramente non corrisponderanno, in questo caso possiamo dare un messaggio amichevole all'utente, chiedendo loro di ricollegarsi.
Allora come salvare i dati dell'originale sessione dopo il logout (la sessione originale scompare dopo il logout)? Considerare di aggiungere un campo nascosto nel modulo, mettere i dati dell'originale sessione in questo campo nascosto, così dopo il logout, fare clic sul pulsante "Torna indietro" e aggiornare il browser, il browser invierà automaticamente i dati dell'originale sessione una volta, senza doverlo salvare manualmente (in realtà potrebbe dover essere salvato nel contesto dell'applicazione servletContext, non ho provato)
È un po' simile a un metodo per risolvere la duplicazione del submit del modulo, ma qui non possiamo eliminare i dati dell'originale sessione, perché il logout e l'accesso non sono la stessa sessione
Specificamente: nel file login.jsp
<% String token=new Random().nextLong()+""; session.setAttribute("token", token); %> <form action="${pageContext.request.contextPath}/servlet/ClientServlet?operation=login" method="post"> <table style="width: 50%;"> <tr> <td align="right">Nome:</td> <td><input type="text" name="name"></td> </tr> <tr> <td align="right">Password:</td> <td><input type="password" name="password"></td> </tr> <tr> <tr> <td></td> <td><input type="submit" value="Accedi"></td> </tr> </table> <input type="hidden" name="token" value="${sessionScope.token}"> </form>
Nel servlet, fornire un suggerimento amichevole e reindirizzare alla pagina di login
HttpSession session = request.getSession(); //Risolvere il problema di accesso più volte dopo il logout tornando indietro e aggiornando il browser //Fornire un campo di input nascosto, ottenere il valore del campo nascosto in background //Dopo la disconnessione, tornare indietro e aggiornare il browser genererà una nuova sessione, quindi sessionToken verrà ottenuto come null //così hiddenToken.equals(sessionToken) sarà sempre false String sessionToken = (String) session.getAttribute("token"); String hiddenToken = request.getParameter("token"); if (!hiddenToken.equals(sessionToken)) { request.setAttribute("message", "Sei stato disconnesso, per favore accedi di nuovo, dopo 2 secondi verrai reindirizzato alla pagina di accesso<meta http-equiv='Refresh' content=2;url=" + request.getContextPath() + "/client/login.jsp>"); request.getRequestDispatcher("/client/message.jsp").forward( request, response); return; }
Test:
Accesso
Dopo aver disconnesso, tornare alla pagina del browser e aggiornare, il browser ti chiederà se desideri inviare i dati di nuovo
Clicca per riinvio
In questo modo si risolve il problema di tornare alla pagina di login dopo aver disconnesso e aggiornare nuovamente il browser per riaccedere.
Questo è tutto il contenuto dell'articolo, speriamo che sia utile per la tua apprendimento, e speriamo che tu sostenga fortemente il tutorial urla.
Dichiarazione: il contenuto di questo articolo è stato raccolto da Internet, il diritto d'autore è della proprietà del rispettivo autore, il contenuto è stato contribuito e caricato autonomamente dagli utenti di Internet, questo sito non detiene i diritti di proprietà, non è stato editato manualmente e non assume responsabilità legali correlate. Se trovi contenuti sospetti di violazione del copyright, ti preghiamo di inviare una e-mail a: notice#oldtoolbag.com (al momento dell'invio dell'e-mail, sostituisci # con @) per segnalare, fornendo prove pertinenti. Una volta verificata, questo sito rimuoverà immediatamente il contenuto sospetto di violazione del copyright.