您現在的位置是:首頁 > 手機遊戲首頁手機遊戲

我的Java Web之路65 - 實現使用者登出退出功能

簡介jsp新增處理使用者退出請求的動作總結介紹前面的文章我們實現了租房網平臺的使用者註冊、使用者登入、會話跟蹤等功能,本篇文章繼續實現使用者的登出退出功能

什麼是登出

本系列文章旨在記錄和總結自己在Java Web開發之路上的知識點、經驗、問題和思考,希望能幫助更多(Java)碼農和想成為(Java)碼農的人。

提示:儘量使用頭條APP閱讀,頭條網頁展示程式碼會有問題。

目錄

介紹

原有的使用者退出功能

思路

修改include。jsp

新增處理使用者退出請求的動作

總結

介紹

前面的文章我們實現了租房網平臺的使用者註冊、使用者登入、會話跟蹤等功能,本篇文章繼續實現使用者的登出/退出功能。

原有的使用者退出功能

實際上,我們之前的版本中,只要使用者登入之後,在每個頁面當中已經有退出按鈕,如下圖:

我的Java Web之路65 - 實現使用者登出/退出功能

其對應的程式碼在我們的 include。jsp 中:

<%@ page language=“java” contentType=“text/html; charset=UTF-8” pageEncoding=“UTF-8”%><%@ page import=“java。util。List” %><%@ page import=“houserenter。entity。House” %><!DOCTYPE html>租房網

你好,${sessionScope。userName}!歡迎來到租房網! 退出



可以看到,這個退出按鈕就是一個普通的連結,直接返回到登入頁面而已。那這樣有什麼不好的地方呢?我們做這樣一個實驗:

先登入到租房網平臺;

登入後可以開啟其他頁面,我這裡假設開啟某個房源詳情頁面,其URL是:http://localhost:8080/house-renter/house-details。action?houseId=1

然後點選退出,會跳轉到登入頁面;

此時我直接在瀏覽器的位址列中重新輸入上述URL,可以新開一個瀏覽器標籤頁,甚至另外開啟一個瀏覽器程序(不過必須是同一款瀏覽器,我這裡是谷歌瀏覽器),敲回車;

結果是我跳過了登入步驟,直接打開了該房源詳情頁面。

結論就是這樣簡單的登入功能很不安全。

究其原因,其實是我們採用了session進行會話跟蹤,只要session不過期,Servlet容器(我們這裡是Tomcat)中的該session物件就還有效,繫結到該session物件中的資料也就還有效。

不過,因為HTTP是基於TCP的,所以不同的TCP連線肯定會產生不同的session,大家有興趣的話可以自行測試一下TCP連線和session之間的關係。

思路

所以,我們的使用者退出功能必須是這樣的:

使用者點選退出按鈕;

Servlet容器必須感知到使用者的退出;

Servlet容器銷燬該使用者的session。

修改include。jsp

Servlet容器感知使用者的退出很簡單,只要傳送一個請求給Servlet容器即可。

所以我們設計一個使用者退出的動作,讓上面的退出按鈕指向該動作:

你好,${sessionScope。userName}!歡迎來到租房網! 退出

新增處理使用者退出請求的動作

我們可以在HouseRenterController中新增處理使用者退出請求的動作:

@GetMapping(“/logout。action”) public ModelAndView getLogout(HttpSession session) { System。out。println(“session: ” + session); System。out。println(“session id: ” + session。getId()); session。invalidate(); ModelAndView mv = new ModelAndView(); mv。setViewName(“redirect:login。html”); return mv; }

重點關注的是,我們呼叫了HttpSession的invalidate()方法,這樣我們就銷燬了該session。

我們是如何得知該方法的呢?我們可以充分利用IDE的自動補足功能,然後檢視每一個方法的javadoc:

我的Java Web之路65 - 實現使用者登出/退出功能

可以發現invalidate()方法就是用來使此session無效,並解除繫結到它的任何物件。

總結

大家可以自行驗證一下,經過這樣改造後,上述問題得到解決。

呼叫HttpSession的invalidate()方法可以使會話無效。

Top