標籤:隱藏 text check cep session == creat ogg save
為了方便使用者登入,幾乎所有的網站都實現了“記住密碼”、“自動登陸”這樣似乎人性化的功能。
我也很喜歡這個功能,因為我自己的腦子實在是討厭記東西。
為了安全起見,我的密碼都設定的很複雜,滿足“數字+特殊符號+英文字母大小寫”。
但密碼一複雜,我就總記不住,就想讓網站替我記住。
但殊不知,這背後隱藏著巨大的風險。
我先勸大家一聲:“危險,不要隨意讓網站記住密碼自動登陸!”
要瞭解事情的真相,請隨我來看一看如何利用cookie實現記住密碼自動登陸。
第一步、構建form表單
<form class="form-signin required-validate" action="${ctx}/login?callbackType=forward"> ${token} <div class="form-group"> <div class="row"> <input class="form-control" type="text" autofocus name="username" value="${username}" placeholder="請輸入會員編號" /> </div> </div> <div class="blank10"></div> <div class="form-group"> <div class="row"> <input class="form-control" type="password" name="password" value="${password}" placeholder="請輸入登陸密碼" /> </div> </div> <div class="form-group"> <div class="row"> <div class="checkbox"> <label> <input type="checkbox" value="1" <c:if test="${isSave == ‘true‘}">checked</c:if> name="isSave" /> 下次自動登入 </label> </div> </div> </div> <div class="form-group"> <div class="row"> <button class="btn btn-lg btn-primary btn-block" type="submit">登入</button> </div> </div></form>
第二步、登陸時利用cookie記住密碼
@RequestMapping("/login")public ModelAndView login(HttpServletResponse response, @RequestParam(value = "username", required = false) String username, @RequestParam(value = "password", required = false) String password) { try { boolean isSave = getParaToBoolean("isSave", false); logger.debug("isSaved " + isSave); // 嘗試擷取cookie String cookieUser = CookieUtil.getCookieByName(request, Constants.COOKIE_USER); logger.debug("cookie的值為:" + cookieUser); // 驗證使用者資訊 Members user = memberService.selectByUsername(username); // 如果IP不同,則清除cookie if (cookieUser != null) { if (!user.getLastip().equals(request.getRemoteAddr())) { // 移除自動登入cookie資訊 CookieUtil.removeCookie(response, Constants.COOKIE_USER);// 刪除cookie } } MembersValidator.checkPassword(password, user.getPassword()); user.setLastip(request.getRemoteAddr());// 更新登入id 和最後登入時間 memberService.updateLastvisit(user); checkToken(); int max_age = Variables.cookie_expire * 3600 * 24; if (isSave) { // 將自動登入資訊存入cookie CookieUtil.setCookie(response, Constants.COOKIE_USER, DesUtils.encrypt(username + "," + password + "," + isSave), max_age); } else { // 移除自動登入cookie資訊 CookieUtil.removeCookie(response, Constants.COOKIE_USER);// 刪除cookie } logger.debug("登陸成功後跳轉"); return ajaxDoneSuccess(user.getUid().toString(), (String) getSessionAttr(Constants.BEFORE_LOGIN_URL)); } catch (Exception e) { logger.error(e.getMessage()); logger.error(e.getMessage(), e); return ajaxDoneError(Constants.SERVER_ERROR); }}
這部分代碼也很清晰明了,就不做多的解釋。
附上CookieUtil.java類
/** * Cookie工具類 * */public class CookieUtil { /** * 添加cookie * * @param response * @param name * @param value * @param maxAge */ public static void setCookie(HttpServletResponse response, String name, String value, int maxAge) { Cookie cookie = new Cookie(name, value); cookie.setPath("/"); if (maxAge > 0) { cookie.setMaxAge(maxAge); } response.addCookie(cookie); } /** * 刪除cookie * * @param response * @param name */ public static void removeCookie(HttpServletResponse response, String name) { Cookie uid = new Cookie(name, null); uid.setPath("/"); uid.setMaxAge(0); response.addCookie(uid); } /** * 擷取cookie值 * * @param request * @return */ public static String getCookieByName(HttpServletRequest request, String cookieName) { Cookie cookies[] = request.getCookies(); if (cookies == null) { return null; } for (Cookie cookie : cookies) { if (cookie.getName().equals(cookieName)) { return cookie.getValue(); } } return null; }}
第三步、從cookie中取出登陸使用者名稱、密碼等關鍵資訊
@RequestMapping("/initLogin")public ModelAndView initLogin() { logger.debug("進入登陸頁"); try { ModelAndView initView = new ModelAndView("login"); String cookieUser = CookieUtil.getCookieByName(request, Constants.COOKIE_USER); if (cookieUser != null) { String decode = DesUtils.decrypt(cookieUser); String[] cookieUsers = decode.split(","); initView.addObject("username", cookieUsers[0]); initView.addObject("password", cookieUsers[1]); initView.addObject("isSave", cookieUsers[2]); } createToken(); return initView; } catch (Exception e) { logger.error(e.getMessage()); logger.error(e.getMessage(), e); return error300(Constants.SERVER_ERROR); }}
當我輸入了帳號、以及密碼後,勾選上“下次自動登陸”,那麼系統在驗證通過後,就會通過cookie記住我的使用者名稱和密碼,下次不用再輸入帳號和密碼,直接點擊登陸就進入系統。
到此為止,自動登陸的功能已經實現了。
那麼,現在可以說一些負責任的話了。
在瀏覽器的開發人員模式下,注意紅色框中的“type=’password’”,此時我們將type修改為text。
注意,注意,你是不是已經發現了,密碼不再是密碼了,成了明文了。
你,此刻是否心驚肉跳了?
對,XX(這文章會被和諧嗎,不至於吧,這早已經不是秘密了,是個程式員都知道)也這樣!
所以,作為一個不務正業的IT狗來說,我奉勸各位,“危險,不要隨意讓網站記住密碼自動登陸!”
假如你的電腦這會被我用,而你又選擇讓網站記住密碼,那對不起了,你再複雜的密碼也不過是一串明文而已!
當然了,放心了,我是不會去看你的密碼了。
不過瀏覽器會不會看你的密碼我就不敢保證了。
既然為了安全,設定了超長超複雜的密碼,那麼每次就手動輸一下嘛,不麻煩,安全得很!
不務正業的IT狗,喜歡讀書和寫作!
掃一掃下方二維碼即可關注 沉默王二 公眾號:
危險,不要隨意讓網站記住密碼自動登陸!