com.anjz.util.CookieUtils.java Source code

Java tutorial

Introduction

Here is the source code for com.anjz.util.CookieUtils.java

Source

/*
 * Copyright 2014 Aliyun.com All right reserved. This software is the
 * confidential and proprietary information of Aliyun.com ("Confidential
 * Information"). You shall not disclose such Confidential Information and shall
 * use it only in accordance with the terms of the license agreement you entered
 * into with Aliyun.com .
 */
package com.anjz.util;

import java.text.FieldPosition;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

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

import org.apache.commons.lang.StringUtils;

/**
 * com.alibaba.platform.buc.sso.common.tool.CookieUtil
 */
public class CookieUtils {
    private static final String PATH = "/";

    /**
     * US locale - all HTTP dates are in english
     */
    public final static Locale LOCALE_US = Locale.US;

    /**
     * Pattern used for old cookies
     */
    public final static String OLD_COOKIE_PATTERN = "EEE, dd-MMM-yyyy HH:mm:ss z";

    //
    // from RFC 2068, token special case characters
    //
    private static final String tspecials = "()<>@,;:\\\"/[]?={} \t";
    private static boolean checkFlag[] = new boolean[127];
    static {
        for (int i = 0; i < tspecials.length(); i++) {
            checkFlag[tspecials.charAt(i)] = true;
        }
    }

    public static String getCookieValue(String key, HttpServletRequest request) {
        Cookie cookie = getCookie(key, request);
        if (cookie == null) {
            return null;
        }
        return cookie.getValue();
    }

    public static Cookie getCookie(String key, HttpServletRequest request) {
        if (request == null) {
            return null;
        }
        Cookie[] cookies = request.getCookies();
        if (cookies == null) {
            return null;
        }
        Cookie value = null;
        for (Cookie c : cookies) {
            if (key.equals(c.getName())) {
                value = c;
                break;
            }
        }
        return value;
    }

    public static void addCookie(String key, String value, HttpServletResponse response) {
        setCookie(key, value, -1, null, null, response);
    }

    public static void addCookie(String key, String value, final boolean httpOnly, HttpServletResponse response) {
        setCookie(key, value, -1, null, null, httpOnly, response);
    }

    public static void addCookie(String key, String value, final boolean httpOnly, final boolean secure,
            HttpServletResponse response) {
        setCookie(key, value, -1, null, null, httpOnly, secure, response);
    }

    public static void addCookie(String key, String value, int maxAge, HttpServletResponse response) {
        setCookie(key, value, maxAge, null, null, response);
    }

    public static void addCookie(String key, String value, int maxAge, final boolean httpOnly,
            HttpServletResponse response) {
        setCookie(key, value, maxAge, null, null, httpOnly, response);
    }

    public static void addCookie(String key, String value, int maxAge, final boolean httpOnly, final boolean secure,
            HttpServletResponse response) {
        setCookie(key, value, maxAge, null, null, httpOnly, secure, response);
    }

    public static void addCookie(String key, String value, int maxAge, String path, String domainName,
            HttpServletResponse response) {
        setCookie(key, value, maxAge, path, domainName, response);
    }

    public static void addCookie(String key, String value, int maxAge, String path, String domainName,
            final boolean httpOnly, HttpServletResponse response) {
        setCookie(key, value, maxAge, path, domainName, httpOnly, response);
    }

    public static void addCookie(String key, String value, int maxAge, String path, String domainName,
            final boolean httpOnly, final boolean secure, HttpServletResponse response) {
        setCookie(key, value, maxAge, path, domainName, httpOnly, secure, response);
    }

    public static void removeCookie(String key, HttpServletResponse response) {
        removeCookie(key, null, null, response);
    }

    public static void removeCookie(String key, String path, String domainName, HttpServletResponse response) {
        setCookie(key, StringUtils.EMPTY, 0, path, domainName, false, response);
    }

    private static void setCookie(String key, String value, int maxAge, String path, String domainName,
            HttpServletResponse response) {
        setCookie(key, value, maxAge, path, domainName, false, false, response);
    }

    private static void setCookie(String key, String value, int maxAge, String path, String domainName,
            final boolean httpOnly, HttpServletResponse response) {
        setCookie(key, value, maxAge, path, domainName, httpOnly, false, response);
    }

    private static void setCookie(String key, String value, int maxAge, String path, String domainName,
            final boolean httpOnly, final boolean secure, HttpServletResponse response) {
        if (response != null) {
            Cookie cookie = new Cookie(key, value);
            cookie.setMaxAge(maxAge);
            if (StringUtils.isNotBlank(path)) {
                cookie.setPath(path);
            } else {
                cookie.setPath(PATH);
            }
            if (StringUtils.isNotBlank(domainName)) {
                cookie.setDomain(domainName);
            }
            cookie.setVersion(0);
            cookie.setSecure(secure);
            if (httpOnly) {
                final StringBuffer buf = new StringBuffer();
                getCookieHeaderValue(cookie, buf, httpOnly);
                response.addHeader(getCookieHeaderName(cookie), buf.toString());
            } else {
                response.addCookie(cookie);
            }
        }
    }

    private static String getCookieHeaderName(final Cookie cookie) {
        final int version = cookie.getVersion();
        if (version == 1) {
            return "Set-Cookie2";
        } else {
            return "Set-Cookie";
        }
    }

    private static void getCookieHeaderValue(final Cookie cookie, final StringBuffer buf, final boolean httpOnly) {
        final int version = cookie.getVersion();

        // this part is the same for all cookies

        String name = cookie.getName(); // Avoid NPE on malformed cookies
        if (name == null) {
            name = "";
        }
        String value = cookie.getValue();
        if (value == null) {
            value = "";
        }

        buf.append(name);
        buf.append("=");

        maybeQuote(version, buf, value);

        // add version 1 specific information
        if (version == 1) {
            // Version=1 ... required
            buf.append("; Version=1");

            // Comment=comment
            if (cookie.getComment() != null) {
                buf.append("; Comment=");
                maybeQuote(version, buf, cookie.getComment());
            }
        }

        // add domain information, if present

        if (cookie.getDomain() != null) {
            buf.append("; Domain=");
            maybeQuote(version, buf, cookie.getDomain());
        }

        // Max-Age=secs/Discard ... or use old "Expires" format
        if (cookie.getMaxAge() >= 0) {
            if (version == 0) {
                buf.append("; Expires=");
                SimpleDateFormat dateFormat = new SimpleDateFormat(OLD_COOKIE_PATTERN, LOCALE_US);
                dateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); //GMT?
                if (cookie.getMaxAge() == 0) {
                    dateFormat.format(new Date(10000), buf, new FieldPosition(0));
                } else {
                    dateFormat.format(new Date(System.currentTimeMillis() + cookie.getMaxAge() * 1000L), buf,
                            new FieldPosition(0));
                }
            } else {
                buf.append("; Max-Age=");
                buf.append(cookie.getMaxAge());
            }
        } else if (version == 1) {
            buf.append("; Discard");
        }

        // Path=path
        if (cookie.getPath() != null) {
            buf.append("; Path=");
            maybeQuote(version, buf, cookie.getPath());
        }

        // Secure
        if (cookie.getSecure()) {
            buf.append("; Secure");
        }

        // HttpOnly
        if (httpOnly) {
            buf.append("; HttpOnly");
        }
    }

    private static void maybeQuote(final int version, final StringBuffer buf, final String value) {
        if (version == 0 || isToken(value)) {
            buf.append(value);
        } else {
            buf.append('"');
            buf.append(value);
            buf.append('"');
        }
    }

    /*
     * Return true iff the string counts as an HTTP/1.1 "token".
     */
    private static boolean isToken(final String value) {
        final int len = value.length();
        char c;
        final char[] charArray = value.toCharArray();
        for (int i = 0; i < len; i++) {
            c = charArray[i];
            if (c < 0x20 || c >= 0x7f) {
                return false;
            } else {
                if (checkFlag[c]) {
                    return false;
                }
            }
        }
        return true;
    }
}