【八】Java 操作cookie

cookie的读、写、删

package com.sid.util;

import com.alibaba.fastjson.JSON;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;

/**
 * @program:
 * @description:    操作cookie
 * @author: Sid
 * @date: 2018-11-01 18:15
 * @since: 1.0
 **/
public class Cookie {

    /**
     * @Description: 写cookie
     * @Param: [key, value, comment, maxAge]
     * @return: void
     * @Author: Sid
     * @Date: 2018-10-23 17:33
     * @since: 1.0
     */
    public static void set(String key, String value, String comment, int maxAge){
        HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
        // 创建Cookie对象
        javax.servlet.http.Cookie cookie = new javax.servlet.http.Cookie(key, value);
        // 配置Cookie对象
        cookie.setComment(comment); // Cookie描述
        cookie.setMaxAge(maxAge); // Cookie有效时间
        cookie.setPath("/");  // Cookie有效路径
        cookie.setHttpOnly(true); //http only

        // 通过response对象将Cookie写入浏览器,需要解决中文乱码问题,否则会抛出异常
        // java.lang.IllegalArgumentException: Control character in cookie value, consider BASE64 encoding your value
        response.setCharacterEncoding("UTF-8");
        //response.setContentType("text/html;charset=UTF-8");
        response.addCookie(cookie);

    }

    /**
     * @Description: 读Cookie
     * @Param: [name]
     * @return: javax.servlet.http.Cookie
     * @Author: Sid
     * @Date: 2018-10-23 17:33
     * @since: 1.0
     */
    public static javax.servlet.http.Cookie get(String name){
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        Map<String, javax.servlet.http.Cookie> cookieMap = new HashMap<>();
        javax.servlet.http.Cookie[] cookies = request.getCookies();
        if (null != cookies) {
            for (javax.servlet.http.Cookie cookie : cookies) {
                cookieMap.put(cookie.getName(), cookie);
            }
        }
        if (cookieMap.containsKey(name)) {
            javax.servlet.http.Cookie cookie = cookieMap.get(name);
            return cookie;
        } else {
            return null;
        }

    }

    /**
     * @Description: 删除 当前请求中的 cookie
     * @Param: [cookieName]
     * @return: void
     * @Author: Sid
     * @Date: 2018-10-23 17:33
     * @since: 1.0
     */
    public static void delete(String cookieName){
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();

        // 获取Cookies数组
        javax.servlet.http.Cookie[] cookies = request.getCookies();
        if(cookies!=null){
            // 迭代查找并清除Cookie
            for (javax.servlet.http.Cookie cookie: cookies) {
                if (cookieName.equals(cookie.getName())) {
                    cookie.setMaxAge(0);
                    cookie.setPath("/");  // Cookie有效路径
                    response.addCookie(cookie);
                }
            }
        }

    }

}

简述

设置HTTP ONLY

cookie.setHttpOnly(true)

默认是false。为true时,js无法获取这个cookie。

设置Cookie有效期和删除Cookie

存放在客户端的Cookie是有有效期的,可以通过setMaxAge(int expiry)方法设置这个Cookie可以保存好长时间,单位为秒。如果没有设置有效期,则默认为-1,表示在浏览器关闭时就删除Cookie内容,如果有效期设置为0,则表示通知浏览器立即删除这个Cookie。

设置Cookie作用范围和域

指定Cookie在哪个网页才有效,通过setPath(String uri)方法即可设置,如果值为“/”表示作用范围为整个网站,默认是这个值。

指定这个Cooke对其他网站有效(也就是不同的域),通过setDomain(String pattern)方法来实现。一般浏览器是不允许一个网站设置另外网站的Cookie内容的,实在要做,就需要修改浏览器的配置才行。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值