企業專案開發--cookie(2)
此文已由作者趙計剛授權網易雲社群釋出。
歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。
2.1.3、CookieUtil:(cookie的基本操作:增刪查,注意沒有改)
1 package com.xxx.util; 2 3 import javax.servlet.http.Cookie; 4 import javax.servlet.http.HttpServletRequest; 5 import javax.servlet.http.HttpServletResponse; 6 7 /** 8 * cookie操作相關類 9 */ 10 public class CookieUtil { 11 12 /** 13 * 增加cookie 14 * @param name cookie名 15 * @param value cookie值 16 * @param domain 指定cookie寫在哪個域下 17 * @param path 指定cookie存在那個路徑下(其實就是一個uri) 18 * @param expiry 指定cookie過期時間 19 */ 20 public static void addCookie(String name, 21 String value, 22 String domain, 23 String path, 24 int expiry, 25 HttpServletResponse response){ 26 Cookie cookie = new Cookie(name, value); 27 28 cookie.setDomain(domain); 29 cookie.setPath(path); 30 cookie.setMaxAge(expiry); 31 32 response.addCookie(cookie); 33 } 34 35 /** 36 * 獲取cookie 37 * @param request 38 * @param key 將要查詢的cookie的名 39 * @return 返回cookie的值 40 */ 41 public static String getCookie(HttpServletRequest request, String key){ 42 Cookie[] cookies = request.getCookies(); 43 /* 44 * 注意在執行迴圈之前,不需要判斷cookies是否為空,因為iterator會在迴圈前執行hasNext; 45 * 但是,最好判斷一下,這樣如果cookies為null的話,我們就可以直接返回,不需要執行迴圈, 46 * 這樣就不需要平白的建立一個iterator物件並執行一次hasNext。 47 * 48 * 下邊的判斷也可以換成這樣CollectionUtils.isEmpty(Arrays.asList(cookies)); 49 */ 50 if(cookies == null || cookies.length == 0){ 51 return null; 52 } 53 54 for(Cookie cookie : cookies){ 55 if(cookie.getName().equals(key)){ 56 return cookie.getValue(); 57 } 58 } 59 return null; 60 } 61 62 /** 63 * 清空指定cookie 64 * 值得注意的是,清空cookie不是隻將相應的cookie的value置空即可,其他資訊依舊設定, 65 * 最後加在響應頭中,去覆蓋瀏覽器端的相應的cookie 66 */ 67 public static void removeCookie(String name, 68 String domain, 69 String path, 70 HttpServletResponse response){ 71 Cookie cookie = new Cookie(name, null); 72 73 cookie.setMaxAge(0); 74 cookie.setDomain(domain); 75 cookie.setPath(path); 76 77 response.addCookie(cookie); 78 } 79 }
注意:
在使用response將cookie寫入響應頭後,我們可以在瀏覽器檢視響應頭中的Set-Cookie資訊,每新增一條cookie,就會有一個Set-Cookie;
在使用request從請求頭中獲取cookie的時候,我們可以在瀏覽器檢視請求頭中的Cookie資訊,所有cookie資訊會以key=value的形式、多個key-value對之間以分號隔開的形式存成一條。
在刪除cookie的時候,一定要注意我們不是隻將相應的cookie的value置空即可,其他資訊依舊設定,最後加在響應頭中,去覆蓋瀏覽器端的相應的cookie
前兩條注意點可以檢視後邊的截圖來驗證。
2.1.4、Admin:
1 package com.xxx.model.userManagement; 2 3 import com.alibaba.fastjson.JSON; 4 5 /** 6 * 管理員 7 */ 8 public class Admin { 9 private int id; 10 private String username; 11 private String password; 12 13 public int getId() { 14 return id; 15 } 16 17 public void setId(int id) { 18 this.id = id; 19 } 20 21 public String getUsername() { 22 return username; 23 } 24 25 public void setUsername(String username) { 26 this.username = username; 27 } 28 29 public String getPassword() { 30 return password; 31 } 32 33 public void setPassword(String password) { 34 this.password = password; 35 } 36 37 //將json串轉為Admin 38 public static Admin parseJsonToAdmin(String jsonStr){ 39 try { 40 return JSON.parseObject(jsonStr, Admin.class); 41 } catch (Exception e) { 42 e.printStackTrace(); 43 return null; 44 } 45 } 46 47 //將當前例項轉化為json串 48 public String toJson(){ 49 return JSON.toJSONString(this); 50 } 51 }
說明:在Admin中,增加了兩個方法,一個是將當前例項轉化為json串,一個是將json串轉化為Admin;這是因為cookie的傳輸只能傳遞字串而不能傳遞物件。
2.2、ssmm0-userManagement:
2.2.1、pom.xml
注意:這個類沒有改動,之所以列出來,是要提醒去注意compile的傳遞性與provided的不可傳遞性
2.2.2、AdminCookieUtil
1 package com.xxx.util.admin; 2 3 import javax.servlet.http.HttpServletRequest; 4 import javax.servlet.http.HttpServletResponse; 5 6 import org.apache.commons.codec.binary.Base64; 7 import org.apache.commons.lang.StringUtils; 8 9 import com.xxx.model.userManagement.Admin; 10 import com.xxx.util.AESUtil; 11 import com.xxx.util.CookieUtil; 12 13 /** 14 * Admin的cookie操作類 15 */ 16 public class AdminCookieUtil { 17 private static final String COOKILE_NAME = "allinfo"; 18 private static final String USER_NAME = "username"; 19 private static final String DOMAIN = "";//when working on localhost the cookie-domain must be set to "" or NULL or FALSE 20 private static final String PATH = "/"; 21 private static final int EXPIRY = -1;//關閉瀏覽器,則cookie消失 22 23 private static final String ENCRYPT_KEY = "gEfcsJx8VUT406qI4r6/3104noOzI/YAaS98cToY+nI=";//加解密金鑰 24 25 public static void addLoginCookie(Admin admin, HttpServletResponse response){ 26 try{ 27 CookieUtil.addCookie(COOKILE_NAME, AESUtil.encrypt(admin.toJson(), Base64.decodeBase64(ENCRYPT_KEY)), DOMAIN, PATH, EXPIRY, response); 28 CookieUtil.addCookie(USER_NAME, admin.getUsername(), DOMAIN, PATH, EXPIRY, response); 29 }catch (Exception e) { 30 e.printStackTrace(); 31 } 32 } 33 34 public static Admin getLoginCookie(HttpServletRequest request){ 35 String json = CookieUtil.getCookie(request, COOKILE_NAME); 36 if(StringUtils.isNotBlank(json)){ 37 try{ 38 return Admin.parseJsonToAdmin(AESUtil.decrypt(json, Base64.decodeBase64(ENCRYPT_KEY))); 39 }catch (Exception e) { 40 e.printStackTrace(); 41 return null; 42 } 43 } 44 return null; 45 } 46 }
注意點:
在localhost下設定的域,必須是""或null或false
步驟:(這就是cookie的使用流程)
登入成功後,寫兩個cookie,一個是username=value,一個是allinfo=一個加密串,這個加密串是先將admin例項轉化為json串,然後通過AES進行加密。
在執行findAdmin方法時,假設前提是需要使用者處於登入狀態(即存在cookie),這個時候讀cookie,先從request中獲取所有cookie,然後遍歷這些cookie,找出其中是否存在name為allinfo的cookie,如果沒有,沒登入,如果有,就登入了,將allinfo的cookie的value先解密再轉化為Admin,之後使用該例項做一些事兒。
免費領取驗證碼、內容安全、簡訊傳送、直播點播體驗包及雲伺服器等套餐
更多網易技術、產品、運營經驗分享請點選。
相關文章:
【推薦】 網易嚴選的wkwebview測試之路