小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

cookie實現(xiàn)自動登陸

 nijiajndx 2011-08-21
 
  

一、什么是用戶自動登錄?

  對于我們的網站向已注冊用戶提供某些專門的服務,比如網上購物、在線下載、收費瀏覽等等,就會要求用戶在使用這些服務之前進入登錄頁面,輸入用戶名和密碼,并進行驗證。

   如果用戶經常訪問我們的網站,假如每天都訪問一次,或者好幾次,那么用戶每次都重復這些登錄操作就會感到相當厭煩。通過一些簡單的技術手段,我們可以讓網站“記住”那些在曾經登錄過的用戶。當該用戶下次再來訪問的時候,網站可以識別該用戶,并為其自動完成登錄過程。

二、基本思路

  作為網站的編寫者,我們無從知道坐在電腦前的那個人是誰。我們能夠知道的是,訪問網站的是哪一臺電腦——這一點可以通過Cookie實現(xiàn)。因此,對用戶的識別實際上就是對客戶端電腦的識別。

單的說,當用戶第一次登錄網站的時候,網站向客戶端發(fā)送一個包含有用戶名的Cookie。當用戶在之后的某個時候再次訪問,瀏覽器就會向網站服務器回送這個Cookie,于是,我們可以從這個Cookie中讀取到用戶名,然后調用登錄的方法,從而實現(xiàn)自動為用戶登錄。

三、防止欺騙

  Cookie只是一個普通的文本文件,那里面包含的字符串可以直接用記事本打開并進行編輯。因此任何人在任何電腦上都可以偽造一個包含有他人用戶名 的 Cookie,從而實現(xiàn)對他人身份的冒用。要解決這個問題,就要在Cookie中附加一項信息,這個信息需要具有以下特性:1、和該用戶一一對應;2、偽 造難度大。這些內容和用戶名一起,以Cookie的形式發(fā)送給用戶的瀏覽器。并且,服務器必須能夠記住這項內容,以便用戶再次訪問的時候進行核對。

  理論上,可以使用該用戶的密碼。密碼具備了前述的兩個特點。但是因為Cookie本身未經加密,保存于其中的密碼(應該加密)可以被任何人看到,因此這個方法極不安全。

  另一種可以加以利用的信息是用戶訪問時的Session id。因為Session id是一個由系統(tǒng)隨機產生的、無規(guī)律的、長度較長的字符串,因此它很難被偽造。要把它和用戶對應起來,我們需要在數據庫中添加一個表,這個表至少有兩個字 段,一個是用戶名,一個是Session id。當用戶首次登錄的時候,我們把當前的Session id和用戶名分別用Cookie發(fā)送給用戶,同時,把這兩項作為一條記錄插入數據庫。這樣,當用戶再次訪問的時候,服務器就可以讀取客戶端發(fā)來的這兩個 Cookie,并且用它們的值和數據庫中的記錄比對。如果在數據庫中找到了相應記錄,就說明這臺電腦的確是該用戶上次登錄時使用的電腦,進而可以為該用戶自動登錄。

四、實現(xiàn)

1、在登錄頁面中添加一個復選框,讓用戶選擇是否愿意在一定時間內實現(xiàn)自動登陸,例如兩周。

代碼:
<input type="checkbox" name="autologin">兩周內自動登錄

2、在負責處理登錄過程的Servlet中,判斷用戶是否選擇了該復選框。如果是,則執(zhí)行這兩個操作:向用戶發(fā)送兩個Cookie,以及向數據庫寫入一條相應的記錄。

代碼:

Cookie ckUsername, ckSessionid;

if (autologin.equals("on")) {
   // 如果用戶選擇了“兩周內自動登錄”,則向用戶發(fā)送兩個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、實現(xiàn)自動登錄。因為用戶下次訪問的時候,可能直接訪問網站的任何頁面(例如通過收藏夾),而不一定是首頁或者登錄頁面,所以我們需要用Filter攔截到達該網站的所有請求,并執(zhí)行自動登錄。

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是上次用戶登錄時保存于用戶端的識別碼,用于用戶后續(xù)訪問的自動登錄。不是本次訪問的session id。
   Cookie[] cookies;
   CookieManager cm = new CookieManager(); // CookieManager是一個自定義的類,用于從Cookie數組中查找并返回指定名稱的Cookie值。
   boolean isAutoLogin;

   // 如果session中沒有user對象,則創(chuàng)建一個。
   User user = (User) session.getAttribute("user");
   if (user == null) {
    user = new User(); // 此時user中的username屬性為"",表示用戶未登錄。
   }

   // 如果user對象的username為"",表示用戶未登錄。則執(zhí)行自動登錄過程。
   // 否則不自動登錄。
   if (user.getUsername().equals("")) {
    // 檢查用戶瀏覽器是否發(fā)送了上次登錄的用戶名和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、注銷。只有當用戶在上次訪問時,未經注銷就離開網站,我們才能在該用戶下次訪問時執(zhí)行自動登錄。如果用戶顯式的執(zhí)行了注銷操作,那就表示該用戶 不希望我們記住他。我們需要在執(zhí)行注銷操作的Servlet中,從數據庫中刪除相應記錄。這樣,下次用戶訪問的時候就不會執(zhí)行自動登錄了。

五、改進

用戶可能為了方便,自行修改Cookie中的有效期,從而達到長期自動登錄的目的。對某些存有敏感信息的網站來說,這樣做并不安全。當用戶長時間沒有使用他的電腦,或者將電腦遺棄、轉讓了,而保存于其中的Cookie仍然是有效的,這就為用戶和網站帶來潛在的風險。

要解決這個問題,我們可以在數據庫中增加一個字段,用以記錄自動登錄的過期日。這樣,是否執(zhí)行自動登錄就不再以客戶端的Cookie有效期為準,而 是以服務器端數據庫中的信息為準。當我們想要調整用戶自動登錄的有效期的時候,只需要修改數據庫中相應的日期字段即可,因而這一過程變得更加安全。


    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多