代碼:
<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);
}