zoukankan      html  css  js  c++  java
  • 企业项目开发--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,之后使用该实例做一些事儿。


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

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


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

  • 相关阅读:
    第三方支付——支付宝支付
    使用Ansible自动配置Nginx服务
    使用Ansible自动配置JDK环境
    mycat 生产环境 cpu 占用 800% 问题 Mycat调优启用useOffHeapForMerge报java.lang.NumberFormatException异常解决(附源码)
    es 备份 恢复
    修改es 副本数 replicas
    Java压缩流GZIPStream导致的内存泄露
    java 堆外内存泄漏 排查
    Linux下查看某一进程所占用内存的方法(转)
    jmap -histo java内存泄漏排查 -XX:MaxDirectMemorySize=2G
  • 原文地址:https://www.cnblogs.com/163yun/p/10143211.html
Copyright © 2011-2022 走看看