此文已由作者赵计刚授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验。

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,之后使用该实例做一些事儿。

免费领取验证码、内容安全、短信发送、直播点播体验包及云服务器等套餐

更多网易技术、产品、运营经验分享请点击

相关文章:
【推荐】 快速登录机器&数据库

企业项目开发--cookie(2)的更多相关文章

  1. 企业项目开发--cookie(1)

    此文已由作者赵计刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 注:本章代码基于<第五章 企业项目开发--mybatis注解与xml并用>的代码,链接如下: h ...

  2. 第六章 企业项目开发--cookie

    注:本章代码基于<第五章 企业项目开发--mybatis注解与xml并用>的代码,链接如下: http://www.cnblogs.com/java-zhao/p/5120792.html ...

  3. 企业项目开发--cookie(3)

    此文已由作者赵计刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 2.2.3.AdminController   1 package com.xxx.web.admin;   ...

  4. 第八章 企业项目开发--分布式缓存memcached

    注意:本节代码基于<第七章 企业项目开发--本地缓存guava cache> 1.本地缓存的问题 本地缓存速度一开始高于分布式缓存,但是随着其缓存数量的增加,所占内存越来越大,系统运行内存 ...

  5. 企业项目开发--分布式缓存memcached(3)

    此文已由作者赵计刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 3.3.ssmm0-data 结构: 3.3.1.pom.xml  1 <?xml version=& ...

  6. 第十一章 企业项目开发--消息队列activemq

    注意:本章代码基于 第十章 企业项目开发--分布式缓存Redis(2) 代码的github地址:https://github.com/zhaojigang/ssmm0 消息队列是分布式系统中实现RPC ...

  7. 企业项目开发--分布式缓存Redis

    第九章 企业项目开发--分布式缓存Redis(1) 注意:本章代码将会建立在上一章的代码基础上,上一章链接<第八章 企业项目开发--分布式缓存memcached> 1.为什么用Redis ...

  8. 第九章 企业项目开发--分布式缓存Redis(1)

    注意:本章代码将会建立在上一章的代码基础上,上一章链接<第八章 企业项目开发--分布式缓存memcached> 1.为什么用Redis 1.1.为什么用分布式缓存(或者说本地缓存存在的问题 ...

  9. 第十章 企业项目开发--分布式缓存Redis(2)

    注意:本章代码是在上一章的基础上进行添加修改,上一章链接<第九章 企业项目开发--分布式缓存Redis(1)> 上一章说了ShardedJedisPool的创建过程,以及redis五种数据 ...

随机推荐

  1. NotificationMangerService处理显示通知

    设置——>应用——>点击“已下载”列表中的任一APP,如图:  代码位置:Settings\src\com\android\settings\applications\InstalledA ...

  2. kbmmw 的HTTPSmartService中的跨域访问

    有同学在使用kbmmw 与extjs 结合的时候,涉及到了跨域访问,这个在 kbmmw 里面已经完全解决. extjs 在访问跨域的时候,首先会使用OPIONS  调用,服务端要根据浏览器请求的 he ...

  3. jetbrains产品的一些使用技巧

    取消界限: 设置默认字符长度的准线,在图一中进行修改目前上限是1000 快捷键的使用: crtl+D:复制当前代码,获取多个类似内容的时候可以直接使用. crtl+F:查找代码中的内容,可以使用正则表 ...

  4. Java的背景、影响及前景

    一.背景 詹姆斯·高斯林出生于加拿大,是一位计算机编程天才.在卡内基·梅隆大学攻读计算机博士学位时,他编写了多处理器版本的Unix操作系统,是JAVA编程语言的创始人. 高斯林生于1955年,已婚,育 ...

  5. php $_SERVER中的一些选项说明

    1, $_SERVER['SCRIPT_FILENAME'] 和 常量 __FILE__的区别(一般情况下两者的显示相同,都是显示文件的绝对路径,包括文件名,显示的起点是 电脑根目录 /) ①,如果在 ...

  6. vue的cli中引入css文件

    在public文件中创建一个文件夹css,放进reset.css 在main.js中引入即可 import '../public/css/reset.css'就可以啦

  7. 第01章:MongoDB简介

    ①MongoDB是什么 MongoDB是一个使用C++编写的.开源的.面向文档的NoSQL(Not Only SQL)数据库,也是当前最热门的NoSql数据库之一. ②MongoDB特点 1.高性能. ...

  8. SpringBoot初探

    一:项目创建 个人用的是IDEA来做Demo的: 1.先创建一个空项目,然后创建一个基于Maven的java application项目: 2.创建好后配置pom.xml文件并最终reimport & ...

  9. CVO实现过程

    module vid_cvo #( , , , , , )( input clk, input rst_p, :] idata, input ivalid, input vid_sop, input ...

  10. TCP、UDP网络通信

    IP地址和端口号 端口号是用两个字节(16位的二进制数)表示的,它的取值范围是0~65535,其中,0~1023之间的端口号用于一些知名的网络服务和应用, 用户的普通应用程序需要使用1024以上的端口 ...