/*
* Copyright (c) 2002-2012 Alibaba Group Holding Limited.
* All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.citrus.service.requestcontext.session.store.cookie;
import static com.alibaba.citrus.util.Assert.*;
import static com.alibaba.citrus.util.ObjectUtil.*;
import static com.alibaba.citrus.util.StringUtil.*;
import javax.servlet.http.HttpServletResponse;
import com.alibaba.citrus.service.requestcontext.session.SessionConfig;
import com.alibaba.citrus.service.requestcontext.session.SessionConfig.CookieConfig;
import com.alibaba.citrus.service.requestcontext.util.CookieSupport;
import com.alibaba.citrus.util.StringUtil;
import com.alibaba.citrus.util.ToStringBuilder;
import com.alibaba.citrus.util.ToStringBuilder.MapBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 抽象的cookie store实现。
*
* @author Michael Zhou
*/
public abstract class AbstractCookieStore implements CookieStore {
protected final Logger log = LoggerFactory.getLogger(getClass());
private String storeName;
private CookieConfig idCookieConfig;
private String name;
private String domain;
private String path;
private Integer maxAge;
private Boolean httpOnly;
private Boolean secure;
private Boolean survivesInInvalidating;
public String getStoreName() {
return storeName;
}
public CookieConfig getIdCookieConfig() {
return idCookieConfig;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDomain() {
return domain;
}
public void setDomain(String domain) {
this.domain = domain;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public int getMaxAge() {
return maxAge;
}
public void setMaxAge(int maxAge) {
this.maxAge = maxAge;
}
public boolean isHttpOnly() {
return httpOnly;
}
public void setHttpOnly(boolean httpOnly) {
this.httpOnly = httpOnly;
}
public boolean getSecure() {
return secure;
}
public void setSecure(boolean secure) {
this.secure = secure;
}
public boolean isSurvivesInInvalidating() {
return survivesInInvalidating;
}
public void setSurvivesInInvalidating(boolean survivesInInvalidating) {
this.survivesInInvalidating = survivesInInvalidating;
}
/** 初始化cookie store。 */
public final void init(String storeName, SessionConfig sessionConfig) throws Exception {
this.idCookieConfig = assertNotNull(sessionConfig, "sessionConfig").getId().getCookie();
this.storeName = storeName;
if (isEmpty(name)) {
throw new IllegalArgumentException("missing cookie name for store: " + storeName);
}
domain = defaultIfEmpty(domain, idCookieConfig.getDomain());
path = defaultIfEmpty(path, idCookieConfig.getPath());
maxAge = defaultIfNull(maxAge, idCookieConfig.getMaxAge());
httpOnly = defaultIfNull(httpOnly, idCookieConfig.isHttpOnly());
secure = defaultIfNull(secure, idCookieConfig.isSecure());
survivesInInvalidating = defaultIfNull(survivesInInvalidating, SURVIVES_IN_INVALIDATING_DEFAULT);
if (survivesInInvalidating && maxAge <= 0) {
throw new IllegalArgumentException(
"Cookie store which Survives In Invalidating must specify MaxAge of cookie");
}
init();
}
/** 初始化cookie store。 */
protected void init() throws Exception {
}
/** 向response中写入cookie。 */
protected void writeCookie(HttpServletResponse response, String cookieName, String cookieValue) {
CookieSupport cookie = new CookieSupport(cookieName, cookieValue);
if (!StringUtil.isEmpty(domain)) {
cookie.setDomain(domain);
}
if (!StringUtil.isEmpty(path)) {
cookie.setPath(path);
}
if (maxAge > 0) {
cookie.setMaxAge(maxAge);
}
cookie.setHttpOnly(httpOnly);
cookie.setSecure(secure);
log.debug("{}", cookie);
cookie.addCookie(response);
}
@Override
public final String toString() {
MapBuilder mb = new MapBuilder();
toString(mb);
return new ToStringBuilder().append("CookieStore").append(mb).toString();
}
protected void toString(MapBuilder mb) {
mb.append("name", name);
mb.append("domain", domain);
mb.append("path", path);
mb.append("maxAge", String.format("%,d seconds", maxAge));
mb.append("httpOnly", httpOnly);
mb.append("secure", secure);
mb.append("survivesInInvalidating", survivesInInvalidating);
}
}