天天看點

JavaWeb應用如何實作保持登入狀态

做JavaWeb開發,難免會遇到登入系統保持登入狀态的問題?比如說我登入過後關閉浏覽器,下次再通路相同的網站,預設會顯示已登入狀态,一段時間内就不必再重新登入了;再比如站在背景接口設計的角度去考慮,使用者登入後,做了一系列的使用者操作接口,那麼這些接口不可能都帶上一個userid的字段吧,這樣不僅開發麻煩,而且容易被黑客攻擊。那麼如何解決這些問題呢?那就是通過代理服務對用戶端請求的攔截來實作,經過驗證後才開始執行業務邏輯。

如何搭建代理服務的過程,這裡就不詳細介紹了,我們以實作保持登入狀态為例,實作原理大概是這樣子的:

1.用戶端請求背景登入接口。

2.背景驗證通過後,将使用者的登入狀态儲存至cookie并寫入用戶端。

3.用戶端再次登入網站,請求login接口時,背景直接從用戶端擷取到該使用者寫入cookie的登入狀态。

4.通過對該狀态的驗證,确認使用者是否需要再次登入。

5.如cookie過期,則跳轉至登入頁;如未過期,則直接顯示為已登入狀态。

這裡前端js用ajax請求即可,如請求一個url位址:

JavaWeb應用如何實作保持登入狀态

我們要注意一點,在請求成功後的Response Headers中,有Set-Cookie一項,設定一個key為java,value為myJavaData的Map值,這個是重點,有這個值用戶端就會自動把這個Map值設為cookie值,這就是我們所說的登入狀态loginState,如下圖所示:

JavaWeb應用如何實作保持登入狀态

那麼這個Set-Cookie一項資料怎麼來呢?是通過Java背景設定的,源碼如下:

// 設定格式
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST");
response.setHeader("Access-Control-Allow-Headers","x-requested-with,content-type");
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("utf-8");

// 建立Cookie
Cookie cookie = new Cookie("java", "myJavaData");
// 有效期,秒為機關
cookie.setMaxAge(3600);
// 設定cookie
response.addCookie(cookie);
response.getWriter().print("cookie建立成功");
           

這樣一來,就實作了在背景服務端為用戶端設定cookie的功能,使用者在下次請求相同域的接口時,java背景隻需

// 擷取用戶端cookie
request.setCharacterEncoding("utf-8");
Cookie[] cookies = request.getCookies();
if (cookies != null) {
	for (Cookie c : cookies) {
		System.out.println(c.getName() + "--->" + c.getValue());
	}
}
           

即可擷取用戶端的登入狀态,進而做出響應操作。(注意)此處的cookie值無需用戶端專門帶入,會随請求自動傳輸到背景。上例中的setMaxAge即為登入狀态的有效期設定點。

還有一種業務狀态是希望,使用者隻要關閉了浏覽器,該登入狀态就會清除,下次打開浏覽器必須重新登入,如CSDN部落格登入即使如此。這種情況我們可以使用session會話實作:java背景設定session代碼

// 設定格式
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST");
response.setHeader("Access-Control-Allow-Headers","x-requested-with,content-type");
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("utf-8");

// 使用request對象的getSession()擷取session,如果session不存在則建立一個
HttpSession session = request.getSession();
// 将資料存儲到session中
session.setAttribute("java", "myJavaData");
// 擷取session的Id
String sessionId = session.getId();
// 判斷session是不是新建立的
if (session.isNew()) {
	response.getWriter().print("session建立成功,session的id是:" + sessionId);
} else {
	System.out.println(session.getAttribute("java")); // 值myJavaData
	response.getWriter().print(
			"伺服器已經存在該session了,session的id是:" + sessionId);
}
           

用戶端請求後,Set-Cookie一項同樣具備了值:

JavaWeb應用如何實作保持登入狀态
JavaWeb應用如何實作保持登入狀态

當然,上面隻是舉了一些簡單的例子,在實際應用中不可能隻儲存一個loginState這麼簡單,還會儲存如OSS_COOKIES,使用token值驗證等多種安全驗證手段綜合。以上實作都是在請求與頁面同域的情況下,如果想要跨域實作,即用戶端與背景不在同一個域名下,則通過JSONP實作。

繼續閱讀