企业项目开发--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,之后使用该实例做一些事儿。
免费领取验证码、内容安全、短信发送、直播点播体验包及云服务器等套餐
更多网易技术、产品、运营经验分享请点击。
相关文章:
【推荐】 网易严选后台系统前端规范化解决方案
【推荐】 为什么 kubernetes 天然适合微服务 (2)