企业项目开发--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,之后使用该实例做一些事儿。
免费领取验证码、内容安全、短信发送、直播点播体验包及云服务器等套餐
更多网易技术、产品、运营经验分享请点击。
相关文章:
【推荐】 快速登录机器&数据库
企业项目开发--cookie(2)的更多相关文章
- 企业项目开发--cookie(1)
此文已由作者赵计刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 注:本章代码基于<第五章 企业项目开发--mybatis注解与xml并用>的代码,链接如下: h ...
- 第六章 企业项目开发--cookie
注:本章代码基于<第五章 企业项目开发--mybatis注解与xml并用>的代码,链接如下: http://www.cnblogs.com/java-zhao/p/5120792.html ...
- 企业项目开发--cookie(3)
此文已由作者赵计刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 2.2.3.AdminController 1 package com.xxx.web.admin; ...
- 第八章 企业项目开发--分布式缓存memcached
注意:本节代码基于<第七章 企业项目开发--本地缓存guava cache> 1.本地缓存的问题 本地缓存速度一开始高于分布式缓存,但是随着其缓存数量的增加,所占内存越来越大,系统运行内存 ...
- 企业项目开发--分布式缓存memcached(3)
此文已由作者赵计刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 3.3.ssmm0-data 结构: 3.3.1.pom.xml 1 <?xml version=& ...
- 第十一章 企业项目开发--消息队列activemq
注意:本章代码基于 第十章 企业项目开发--分布式缓存Redis(2) 代码的github地址:https://github.com/zhaojigang/ssmm0 消息队列是分布式系统中实现RPC ...
- 企业项目开发--分布式缓存Redis
第九章 企业项目开发--分布式缓存Redis(1) 注意:本章代码将会建立在上一章的代码基础上,上一章链接<第八章 企业项目开发--分布式缓存memcached> 1.为什么用Redis ...
- 第九章 企业项目开发--分布式缓存Redis(1)
注意:本章代码将会建立在上一章的代码基础上,上一章链接<第八章 企业项目开发--分布式缓存memcached> 1.为什么用Redis 1.1.为什么用分布式缓存(或者说本地缓存存在的问题 ...
- 第十章 企业项目开发--分布式缓存Redis(2)
注意:本章代码是在上一章的基础上进行添加修改,上一章链接<第九章 企业项目开发--分布式缓存Redis(1)> 上一章说了ShardedJedisPool的创建过程,以及redis五种数据 ...
随机推荐
- Django框架之序列化和上传文件
一.Django的序列化(对于ajax请求) Django中的序列化主要应用在将数据库中检索的数据返回给客户端用户,特别的Ajax请求一般返回的为Json格式. 1)django序列化的使用方法 . ...
- Linux下移植QT(2)---移植QT
准备:ubantu12.04 内核 3.0.8(最好用同样的内核,3.2.0时没成功) 交叉编译工具:arm-cortex_a8-linux-gnueabi-gcc-4.4.6 QT版本5.4.2 ...
- boost--ref
1.ref简介 reference_wrapper包含在ref库中,它是引用包装器类型,即其内部包装了引用. 成员函数get().get_pointer()分别可以获得被包装的引用和其指针.使用需要包 ...
- hadoop sqoop的常用名命令
1 列出所有的ambari数据库中所有的表 Sqoop list-tables -connect jdbc:mysql://localhost:3306/ambari -username ambar ...
- Silverlight子窗口(ChildWindow)传递参数到父窗口演示
在企业级项目中,子窗口(ChildWindow)是一个常用控件,其展示方式是以弹出窗口来显示信息. 这里我将演示,子窗口传递参数到父窗口的方法.由于我的开发环境都是英文环境,所以部分中文可能显示不正常 ...
- 用Kotlin写一个基于Spring Boot的RESTful服务
Spring太复杂了,配置这个东西简直就是浪费生命.尤其在没有什么并发压力,随便搞一个RESTful服务 让整个业务跑起来先的情况下,更是么有必要纠结在一堆的XML配置上.显然这么想的人是很多的,于是 ...
- zend studio 修改字体大小
第一步:进入设置窗口 windows -> preferences第二步:进入修改字体的选项卡. General -> Appearance -> Colors and ...
- 21069207《Linux内核原理与分析》第四周作业
本周首先我结合mooc网的视频资料,了解了计算机的三大法宝,分别是存储程序计算机,函数调用堆栈和中断机制. 在计算机的三大法宝中,存储程序计算机是根本,函数调用堆栈是高级语言运行的基础,而中断机制成就 ...
- jvm虚拟机---执行引擎子系统
Java虚拟机只与Class文件相关联,它规定了Class文件应该具有的格式,而不论该文件是由什么语言编写并编译而来.所以,任何语言只要能够最终编译成符合Java虚拟机要求的Class文件,就可以运行 ...
- java基础知识-数据类型及转换
1.java中的常量大体分为两种: <1>字面量常量 <2>自定义常量 2.java中常量(字面量)的分类:<1>,整数常量:直接出现的整数<2>,小数 ...