j2ee cookie 實現自動登入
一、什麼是使用者自動登入?
對於我們的網站向已註冊使用者提供某些專門的服務,比如網上購物、線上下載、收費瀏覽等等,就會要求使用者在使用這些服務之前進入登入頁面,輸入使用者名稱和密碼,並進行驗證。
如果使用者經常訪問我們的網站,假如每天都訪問一次,或者好幾次,那麼使用者每次都重複這些登入操作就會感到相當厭煩。通過一些簡單的技術手段,我們可以讓網站“記住”那些在曾經登入過的使用者。當該使用者下次再來訪問的時候,網站可以識別該使用者,併為其自動完成登入過程。
二、基本思路
作為網站的編寫者,我們無從知道坐在電腦前的那個人是誰。我們能夠知道的是,訪問網站的是哪一臺電腦——這一點可以通過Cookie實現。因此,對使用者的識別實際上就是對客戶端電腦的識別。
簡單的說,當使用者第一次登入網站的時候,網站向客戶端傳送一個包含有使用者名稱的Cookie。當使用者在之後的某個時候再次訪問,瀏覽器就會向網站伺服器回送這個Cookie,於是,我們可以從這個Cookie中讀取到使用者名稱,然後呼叫登入的方法,從而實現自動為使用者登入。
三、防止欺騙
Cookie只是一個普通的文字檔案,那裡麵包含的字串可以直接用記事本開啟並進行編輯。因此任何人在任何電腦上都可以偽造一個包含有他人使用者名稱 的 Cookie,從而實現對他人身份的冒用。要解決這個問題,就要在Cookie中附加一項資訊,這個資訊需要具有以下特性:1、和該使用者一一對應;2、偽 造難度大。這些內容和使用者名稱一起,以Cookie的形式傳送給使用者的瀏覽器。並且,伺服器必須能夠記住這項內容,以便使用者再次訪問的時候進行核對。
理論上,可以使用該使用者的密碼。密碼具備了前述的兩個特點。但是因為Cookie本身未經加密,儲存於其中的密碼(應該加密)可以被任何人看到,因此這個方法極不安全。
另一種可以加以利用的資訊是使用者訪問時的Session id。因為Session id是一個由系統隨機產生的、無規律的、長度較長的字串,因此它很難被偽造。要把它和使用者對應起來,我們需要在資料庫中新增一個表,這個表至少有兩個字 段,一個是使用者名稱,一個是Session id。當使用者首次登入的時候,我們把當前的Session id和使用者名稱分別用Cookie傳送給使用者,同時,把這兩項作為一條記錄插入資料庫。這樣,當使用者再次訪問的時候,伺服器就可以讀取客戶端發來的這兩個 Cookie,並且用它們的值和資料庫中的記錄比對。如果在資料庫中找到了相應記錄,就說明這臺電腦的確是該使用者上次登入時使用的電腦,進而可以為該使用者自動登入。
四、實現
1、在登入頁面中新增一個核取方塊,讓使用者選擇是否願意在一定時間內實現自動登陸,例如兩週。
程式碼:
<input type="checkbox" name="autologin">兩週內自動登入
2、在負責處理登入過程的Servlet中,判斷使用者是否選擇了該核取方塊。如果是,則執行這兩個操作:向使用者傳送兩個Cookie,以及向資料庫寫入一條相應的記錄。
程式碼:
Cookie ckUsername, ckSessionid;
if (autologin.equals("on")) {
// 如果使用者選擇了“兩週內自動登入”,則向使用者傳送兩個cookie。
// 一個cookie記錄使用者名稱,另一個記錄唯一的驗證碼,
// 並將此驗證碼寫入資料庫,以備使用者返回時查詢。(防止偽造cookie)
ckUsername = new Cookie("autoLoginUser", user.getUsername()); // user是代表使用者的bean
ckUsername.setMaxAge(60 * 60 * 24 * 14); //設定Cookie有效期為14天
res.addCookie(ckUsername);
sessionid = session.getId(); // 取得當前的session id
ckSessionid = new Cookie("sessionid", sessionid);
ckSessionid.setMaxAge(60 * 60 * 24 * 14);
res.addCookie(ckSessionid);
// 在資料庫中插入相應記錄
userSessionDAO.insertUserSession(user, sessionid);
}
3、實現自動登入。因為使用者下次訪問的時候,可能直接訪問網站的任何頁面(例如通過收藏夾),而不一定是首頁或者登入頁面,所以我們需要用Filter攔截到達該網站的所有請求,並執行自動登入。
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
HttpSession session = request.getSession(true);
String username;
String sessionid; // 此sessionid是上次使用者登入時儲存於使用者端的識別碼,用於使用者後續訪問的自動登入。不是本次訪問的session id。
Cookie[] cookies;
CookieManager cm = new CookieManager(); // CookieManager是一個自定義的類,用於從Cookie陣列中查詢並返回指定名稱的Cookie值。
boolean isAutoLogin;
// 如果session中沒有user物件,則建立一個。
User user = (User) session.getAttribute("user");
if (user == null) {
user = new User(); // 此時user中的username屬性為"",表示使用者未登入。
}
// 如果user物件的username為"",表示使用者未登入。則執行自動登入過程。
// 否則不自動登入。
if (user.getUsername().equals("")) {
// 檢查使用者瀏覽器是否傳送了上次登入的使用者名稱和sessionid,
// 如果是,則為使用者自動登陸。
cookies = request.getCookies();
username = cm.getCookieValue(cookies, "autoLoginUser");
sessionid = cm.getCookieValue(cookies, "sessionid");
isAutoLogin = userSessionDAO.getAutoLoginState(username, sessionid); // 如果在資料庫中找到了相應記錄,則說明可以自動登入。
if (isAutoLogin) {
user.setUsername(username);
user.setNickname(DBUtil.getNickName(username));
session.setAttribute("user", user); // 將user bean新增到session中。
}
}
chain.doFilter(req, resp);
}
4、登出。只有當使用者在上次訪問時,未經登出就離開網站,我們才能在該使用者下次訪問時執行自動登入。如果使用者顯式的執行了登出操作,那就表示該使用者 不希望我們記住他。我們需要在執行登出操作的Servlet中,從資料庫中刪除相應記錄。這樣,下次使用者訪問的時候就不會執行自動登入了。
五、改進
使用者可能為了方便,自行修改Cookie中的有效期,從而達到長期自動登入的目的。對某些存有敏感資訊的網站來說,這樣做並不安全。當使用者長時間沒有使用他的電腦,或者將電腦遺棄、轉讓了,而儲存於其中的Cookie仍然是有效的,這就為使用者和網站帶來潛在的風險。
要解決這個問題,我們可以在資料庫中增加一個欄位,用以記錄自動登入的過期日。這樣,是否執行自動登入就不再以客戶端的Cookie有效期為準,而 是以伺服器端資料庫中的資訊為準。當我們想要調整使用者自動登入的有效期的時候,只需要修改資料庫中相應的日期欄位即可,因而這一過程變得更加安全。
相關文章
- playwright自動登入獲取cookie/ckCookie
- 實現Web程式的自動登入Web
- Python培訓分享:python如何用cookie實現自動模擬登入?PythonCookie
- 教你實現windowsxp自動登入大法(轉)Windows
- Python自動登入QQ的實現示例Python
- 自動化驗證碼登入如何實現?
- YII2自動登入Cookie失效問題解決Cookie
- mmall_v2.0 Redis + Cookie 實現單點登入RedisCookie
- python+pytest介面自動化(9)-cookie繞過登入(保持登入狀態)PythonCookie
- SharedPreferences實現記住密碼----自動登入功能密碼
- 短影片商城系統,session和cookie實現登入SessionCookie
- win10系統怎麼設定自動登入 win10電腦實現自動登入的方法Win10
- 用python登入WeChat 實現自動回覆(非常詳細)Python
- python處理web網頁cookies實現自動登入PythonWeb網頁Cookie
- Laravel 通過 cookie 實現基於 session 的單點登入LaravelCookieSession
- JS+PHP實現登入後自動執行之前的操作JSPHP
- iOS 實現自動登入(從低階做法到高階做法)iOS
- 使用 Forth 實現驗證碼識別與自動化登入
- 使用 Crystal 實現驗證碼識別與自動化登入
- lubuntu自動登入(lxde)Ubuntu
- linux 實現開機自動登陸Linux
- iTerm2 實現 ssh 自動登入,並使用 Zmodem 實現快速傳輸檔案
- 直播系統原始碼,自動登入及記住密碼實現原始碼密碼
- 使用 C++ 實現驗證碼識別與自動化登入C++
- SecureCRT - 自動登入跳轉Securecrt
- 04.Django實現完整登入系統的兩種方法(cookie and session)DjangoCookieSession
- WinForm應用程式的開機自啟、記住密碼,自動登入的實現ORM密碼
- 用j2ee如何實現applet系統的單點登入APP
- Python+selenium實現Drcom校園網自動檢測網路以及自動登入Python
- RHCE_LAB(2)SSH遠端登入自動驗證(不輸入使用者登入密碼)的實現薦密碼
- Cookie和Session的區別,Koa2+Mysql+Redis實現登入邏輯CookieSessionMySqlRedis
- 自動登入的設計思路
- 讓WindowsXP也能自動登入Windows
- C#三種模擬自動登入和提交POST資訊的實現方法C#
- win10如何設定自動登入 win10設定自動登入的方法Win10
- Vue-router實現單頁面應用在沒有登入情況下,自動跳轉到登入頁面Vue
- java實現微信登入Java
- jQuery實現的利用cookie儲存使用者登入資訊程式碼例項jQueryCookie