1. 程式人生 > >企業專案開發--cookie(2)

企業專案開發--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:

2018121913141821b2a05b-a68f-429c-a7ba-600e6ad053fb.jpg


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測試之路