All Downloads are FREE. Search and download functionalities are using the official Maven repository.

nablarch.fw.web.HttpCookie Maven / Gradle / Ivy

The newest version!
package nablarch.fw.web;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import jakarta.servlet.http.Cookie;

import nablarch.core.util.annotation.Published;
import nablarch.core.util.map.MapWrapper;

/**
 * Httpクッキーのパーサー及びその内容を保持するデータオブジェクト。
 *
 * @author Iwauo Tajima 
 */
@Published(tag = "architect")
public class HttpCookie extends MapWrapper {

    /** クッキー名と値のペアを格納したMap */
    private final Map cookies;

    /** Max-Age属性 */
    private Integer maxAge;

    /** Path属性 */
    private String path;

    /** Domain属性 */
    private String domain;

    /** Secure属性 */
    private boolean secure;

    /** HttpOnly属性 */
    private boolean httpOnly;

    /**
     * デフォルトコンストラクタ。
     */
    public HttpCookie() {
        cookies = new HashMap();
    }

    /**
     * {@link Cookie}から{@link HttpCookie}を生成する。
     * @param cookie JavaEE サーブレットAPIのCookieオブジェクト
     * @return {@link HttpCookie}オブジェクト
     */
    public static HttpCookie fromServletCookie(Cookie cookie) {
        HttpCookie httpCookie = new HttpCookie();

        if (cookie.getValue() == null) {
            throw new IllegalArgumentException("Cookie value must not be null.");
        }
        httpCookie.put(cookie.getName(), cookie.getValue());

        if (cookie.getMaxAge() != -1) {
            httpCookie.setMaxAge(cookie.getMaxAge());
        }

        if (cookie.getPath() != null) {
            httpCookie.setPath(cookie.getPath());
        }

        if (cookie.getDomain() != null) {
            httpCookie.setDomain(cookie.getDomain());
        }

        httpCookie.setSecure(cookie.getSecure());

        httpCookie.setHttpOnly(cookie.isHttpOnly());

        return httpCookie;
    }

    /**
     * RFC6265に従い、Set-Cookieヘッダをパースして{@link HttpCookie}を生成する。
     * {@link HttpCookie}はPath、Domain、Max-Age、Secure、HttpOnly属性のみをサポートしているため、それ以外の属性はパース時に無視する。
     * @see RFC6265 4.1.1. Syntax
     * @param header Set-Cookieヘッダ(Set-Cookie: を含む)
     * @return {@link HttpCookie} インスタンス
     */
    public static HttpCookie fromSetCookieHeader(String header) {

        if (header == null) {
            throw new IllegalArgumentException("Cookie string must not be null.");
        }
        if (!header.startsWith("Set-Cookie: ")) {
            throw new IllegalArgumentException("Cookie string must start with 'Set-Cookie: '.");
        }

        List cookies = java.net.HttpCookie.parse(header);

        // java.net.HttpCookie.parse()は、複数のクッキーを含み得るSet-Cookie2ヘッダにも対応しているため、List型の値を返却している。
        // ただし、ヘッダが"Set-Cookie: "から始まることを上で確認しているので、Listのサイズは必ず1となる。
        java.net.HttpCookie cookie = cookies.get(0);

        HttpCookie httpCookie = new HttpCookie();

        httpCookie.put(cookie.getName(), cookie.getValue());

        httpCookie.setPath(cookie.getPath());

        httpCookie.setDomain(cookie.getDomain());

        // HttpCookieクラスでは、JavaEEのCookieクラスに合わせて、Max-Age属性の値をInteger型で保持しているため、long型の値をint型にキャストしている。
        httpCookie.setMaxAge((int) cookie.getMaxAge());

        httpCookie.setSecure(cookie.getSecure());

        httpCookie.setHttpOnly(cookie.isHttpOnly());

        return httpCookie;
    }

    /**
     * このクッキーの最長の存続期間(秒)を返す。(未設定の場合はnull)
     *
     * @return このクッキーの最長の存続期間(秒)
     */
    public Integer getMaxAge() {
        return maxAge;
    }

    /**
     * このクッキーの最長の存続期間(秒)を指定する。
     *
     * @param maxAge
     *            このクッキーの最長の存続期間(秒)
     * @return このオブジェクト自体
     */
    @SuppressWarnings("UnusedReturnValue")
    public HttpCookie setMaxAge(final Integer maxAge) {
        this.maxAge = maxAge;
        return this;
    }

    /**
     * このクッキーが送信されるURIのパス階層を返す。
     *
     * @return このクッキーが送信されるURI階層
     */
    public String getPath() {
        return path;
    }

    /**
     * このクッキーが送信されるURIのパス階層を指定する。
     *
     * @param path
     *            このクッキーが送信されるURI階層
     * @return このオブジェクト自体
     */
    public HttpCookie setPath(String path) {
        this.path = path;
        return this;
    }

    /**
     * このクッキーが送信されるドメイン階層を返す。
     *
     * @return このクッキーが送信されるドメイン階層
     */
    public String getDomain() {
        return domain;
    }

    /**
     * このクッキーが送信されるドメイン階層を指定する。
     *
     * @param domain
     *            このクッキーが送信されるドメイン階層
     * @return このオブジェクト自体
     */
    @SuppressWarnings("UnusedReturnValue")
    public HttpCookie setDomain(String domain) {
        this.domain = domain;
        return this;
    }

    /**
     * Secure Cookieか否か。
     *
     * @return trueの場合は、Secure Cookie
     */
    public boolean isSecure() {
        return secure;
    }

    /**
     * Secure Cookieか否かを設定する。
     *
     * @param secure
     *            trueの場合は、Secure Cookie
     */
    public HttpCookie setSecure(boolean secure) {
        this.secure = secure;
        return this;
    }

    /**
     * HttpOnly Cookieか否か。
     *
     * @return trueの場合は、HttpOnly Cookie
     */
    public boolean isHttpOnly() {
        return httpOnly;
    }

    /**
     * HttpOnly Cookieか否かを設定する。
     *
     * @param httpOnly trueの場合は、HttpOnly Cookie
     * @return このオブジェクト自体
     */
    @SuppressWarnings("UnusedReturnValue")
    public HttpCookie setHttpOnly(final boolean httpOnly) {
        this.httpOnly = httpOnly;
        return this;
    }

    /**
     * {@link Cookie}オブジェクトのリストに変換して返す。
     * @return {@link Cookie}リスト
     */
    public List convertServletCookies() {
        final List servletCookies = new ArrayList();

        for (Map.Entry entry : getDelegateMap().entrySet()) {
            final Cookie servletCookie = new Cookie(entry.getKey(), entry.getValue());

            if (getMaxAge() != null) {
                servletCookie.setMaxAge(getMaxAge());
            }

            if (getPath() != null) {
                servletCookie.setPath(getPath());
            }

            if (getDomain() != null) {
                servletCookie.setDomain(getDomain());
            }

            servletCookie.setSecure(isSecure());
            servletCookie.setHttpOnly(isHttpOnly());

            servletCookies.add(servletCookie);
        }
        return servletCookies;
    }

    @Override
    public Map getDelegateMap() {
        return cookies;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy