java Cookie的增删改查

package com.test.cookie;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/* * Cookie的增删改查方法 crud * 其中: * 读取Cookie2种方式: * 1,通过foreach比较找出对应的value; * 2通过map来取值 */
public class CookieUtils {
    // 增加,支持中文值
    //如果直接添加中文,报错// java.lang.IllegalArgumentException: Control character in cookie value or attribute
    public static void addCookie(HttpServletResponse response, String name,
            String value, int maxAge) {
        //对中文进行编码,字母,数字不受影响
        String utfvalue = null;
        try {
            utfvalue = URLEncoder.encode(value.trim(), "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        Cookie cookie = new Cookie(name.trim(), utfvalue);

        // 设置时间,默认Cookie的值只在浏览器的会话期间存在,当用户退出浏览器这些值就消失了!
        if (maxAge > 0) {
            cookie.setMaxAge(maxAge);// 单位秒
        }
        // 设置路径,这个路径即该工程下都可以访问该cookie;如果不设置路径,那么只有设置该cookie路径及其子路径可以访问
        cookie.setPath("/");
        // 添加
        response.addCookie(cookie);
// System.out.println("添加成功!");
    }

    // 读
    // 有2种方式,第一种通过foreach比较找出对应的value,第2种通过map来取值
    // 第一种方式,通过name获取cookie对象,进而获取name
    public static Cookie getCookie(HttpServletRequest request, String name) {
    Map<String, Cookie> map = getCookieMap(request, name);
        if (map.containsKey(name)) {
            return map.get(name);
        }
        return null;
    }

private static Map<String, Cookie> getCookieMap(HttpServletRequest request,
            String name) {
        Cookie coos[] = request.getCookies();
        Map<String, Cookie> cookieMap = new HashMap<>();
        if (coos != null) {
            for (Cookie cookie : coos) {
                cookieMap.put(cookie.getName(), cookie);
            }
        }
        return cookieMap;
    }

    // 第二种方式,遍历比较
    public static String getCookieValue(HttpServletRequest request, String name) {
        Cookie coos[] = request.getCookies();
        if (coos != null) {
            for (Cookie cookie : coos) {
                if (cookie.getName().equals(name)) {
                    try {
                //这里是为了解码出中文,所以用了解码器
                        return URLDecoder.decode(cookie.getValue(), "UTF-8");
                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                    }

                }
            }
        }
        return null;
    }

    // 改,支持中文修改value值
    // 修改、删除Cookie时,新建的Cookie除value、maxAge之外的所有属性,例如name、path、domain等,都要与原Cookie完全一样。
    // 否则,浏览器将视为两个不同的Cookie不予覆盖,导致修改、删除失败。
    //修改实现方式:1,可以自已遍历比较cookie.getName().equals(name),然后自已添加
    // 2,判断之后可以调用addCookie方法添加
    //这里采用方式1
    //设置默认的Cookie时间1天(注意,从Cookie中获取时间是无效的)
    public static boolean updateCookie(HttpServletRequest request,HttpServletResponse response, String name, String value) {
        return updateCookie(request, response, name, value, 1*24*60*60);
    }
    //修改Cookie时间
    public static boolean updateCookie(HttpServletRequest request,
            HttpServletResponse response, String name, String value,int maxAge) {
        String utfvalue=null;
        try {
            //处理中文
            utfvalue=URLEncoder.encode(value.trim(), "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        Cookie coos[] = request.getCookies();
        boolean flag = false;
        if (coos != null) {
            for (Cookie cookie : coos) {
                if (cookie.getName().equals(name)) {
                    try {
System.out.println("原值为:" + URLDecoder.decode(cookie.getValue(), "UTF-8"));
                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                    }
                    cookie.setValue(utfvalue);
                    cookie.setPath("/");
                    cookie.setMaxAge(maxAge);
                    response.addCookie(cookie);
                    flag = true;
                    break;
                }
            }
            if (flag==false) {
                System.out.println("没有找到你要修改的Cookie!");
            }
        }
        return flag;
    }


    // 删
    // 方式1:删除进行查找,有的话就删除
    public static boolean deleteCookie(HttpServletRequest request,
            HttpServletResponse response, String name) {
        Cookie coos[] = request.getCookies();
        boolean flag = false;
        if (coos != null) {
            for (Cookie cookie : coos) {
                if (cookie.getName().equals(name)) {
                    //cookie.setValue(null);
                    //路径要保持一致
                    cookie.setMaxAge(0);
                    cookie.setPath("/");
                    response.addCookie(cookie);
                    System.out.println("被删除的cookie名字为:"+cookie.getName());
                    flag=true;
                    break;
                }
            }
        }
        return flag;
    }

    //方式2:简化版,直接删除,有就删除,没有就没有
           public static void deleteCookie1( HttpServletResponse response,String name){
                  Cookie cookie = new Cookie(name, null);
                  cookie.setMaxAge(0);
                  cookie.setPath("/");
                  response.addCookie(cookie);
           }
}

你可能感兴趣的:(缓存,cookie)