提交 62312ee4 编写于 作者: 街头小贩's avatar 街头小贩

增加olMemberSession缓存

上级 fc252e6d
......@@ -15,6 +15,7 @@ import com.apobates.forum.utils.DateTimeUtils;
* @since 20200905
*/
public class MemberSessionBeanConverter {
public static Map<String,String> toMap(MemberSessionBean msb){
Map<String,String> data = new HashMap<>();
data.put("mid", msb.getMid() + "");
......
......@@ -5,46 +5,132 @@ import com.apobates.forum.member.entity.MemberRoleEnum;
import com.apobates.forum.member.entity.MemberStatusEnum;
import com.apobates.forum.member.storage.MetaConfig;
import com.apobates.forum.member.storage.OnlineMemberStorage;
import com.apobates.forum.member.storage.cookie.CookieMetaConfig;
import com.apobates.forum.member.storage.core.MemberSessionBean;
import com.apobates.forum.member.storage.core.MemberSessionBeanConverter;
import com.apobates.forum.utils.Commons;
import com.apobates.forum.utils.CookieUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.jcache.JCacheCacheManager;
import javax.cache.Cache;
import javax.cache.CacheManager;
import javax.cache.configuration.MutableConfiguration;
import javax.cache.expiry.CreatedExpiryPolicy;
import javax.cache.expiry.Duration;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDateTime;
import java.util.Map;
import java.util.Optional;
/**
* 使用Ehcache存储会员在线信息
*
* @see https://www.ehcache.org/documentation/3.5/107.html
* @author xiaofanku
* @since 20201001
*/
public class OnlineMemberEhcacheStorage implements OnlineMemberStorage {
@Autowired
private MetaConfig metaConfig;
private CookieMetaConfig metaConfig;
@Autowired
private JCacheCacheManager cacheCacheManager;
private final static String EHC_STORE = "olMemberSession";
private final static Logger logger = LoggerFactory.getLogger(OnlineMemberEhcacheStorage.class);
/*
public OnlineMemberEhcacheStorage(MetaConfig metaConfig) {
this.metaConfig = metaConfig;
}*/
@Override
public void store(MemberSessionBean memberSessionBean, HttpServletRequest request, HttpServletResponse response) {
String passStub = rndStub();
Optional<String> afterPart = hash(passStub, memberSessionBean.getIpAddr()); //前缀:hashValue
//过期日期
LocalDateTime expireDate = LocalDateTime.now().plusDays(1L);
Map<String,String> val = MemberSessionBeanConverter.toMap(memberSessionBean, expireDate);
if (afterPart.isPresent() && null != val && !val.isEmpty()) {
String ecKey = metaConfig.getName() + ":" + afterPart.get();
CacheManager cacheManager = cacheCacheManager.getCacheManager();
try {
MutableConfiguration<String, MemberSessionBean> configuration = new MutableConfiguration<String, MemberSessionBean>()
.setTypes(String.class, MemberSessionBean.class)
.setStoreByValue(true)
.setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(Duration.ONE_DAY));
Cache<String, MemberSessionBean> cache = cacheManager.getCache(EHC_STORE, String.class, MemberSessionBean.class);
cache.put(ecKey, memberSessionBean);
cache.close();
}finally {
cacheManager.close();
}
serializeCookie(passStub, expireDate, request, response, metaConfig.getName(), metaConfig.getPath(), metaConfig.getDomain(), metaConfig.isHttps());
}
}
@Override
public void delete(HttpServletRequest request, HttpServletResponse response) {
Optional<String> afterPart = getEhcacheKey(request); //前缀:hashValue
if (afterPart.isPresent()) {
String ecKey = metaConfig.getName() + ":" + afterPart.get();
CacheManager cacheManager = cacheCacheManager.getCacheManager();
try {
cacheManager.getCache(EHC_STORE).remove(ecKey);
}finally {
cacheManager.close();
}
expireCookie(request, response, metaConfig.getName(), metaConfig.getPath(), metaConfig.getDomain());
}
}
private Optional<String> getEhcacheKey(HttpServletRequest request){
Cookie cookie = CookieUtils.queryCookie(request, metaConfig.getName()).orElse(null);
if (null == cookie) {
return Optional.empty();
}
String passStub = cookie.getValue();
return hash(passStub, Commons.getRequestIp(request)); //前缀:hashValue
}
@Override
public Optional<MemberSessionBean> getInstance(HttpServletRequest request, String sentinel) {
Optional<String> afterPart = getEhcacheKey(request); //前缀:hashValue
if (!afterPart.isPresent()) {
return Optional.empty();
}
String ecKey = metaConfig.getName() + ":" + afterPart.get();
CacheManager cacheManager = cacheCacheManager.getCacheManager();
try {
Cache<String, MemberSessionBean> cache = cacheManager.getCache(EHC_STORE);
MemberSessionBean msb = cache.get(ecKey);
cache.close();
return Optional.ofNullable(msb);
}catch(Exception e){
if(logger.isDebugEnabled()){
logger.debug(e.getMessage(), e);
}
}finally {
cacheManager.close();
}
return Optional.empty();
}
@Override
public void refresh(HttpServletRequest request, HttpServletResponse response, MemberStatusEnum status, MemberGroupEnum group, MemberRoleEnum role) {
Optional<String> afterPart = getEhcacheKey(request); //前缀:hashValue
if (!afterPart.isPresent()) {
return;
}
String ecKey = metaConfig.getName() + ":" + afterPart.get();
CacheManager cacheManager = cacheCacheManager.getCacheManager();
try {
Cache<String, MemberSessionBean> cache = cacheManager.getCache(EHC_STORE);
MemberSessionBean msb = cache.get(ecKey);
cache.put(ecKey, msb.refact(group, role, status));
cache.close();
}catch(Exception e){
if(logger.isDebugEnabled()){
logger.debug(e.getMessage(), e);
}
}finally {
cacheManager.close();
}
}
@Override
......@@ -56,4 +142,67 @@ public class OnlineMemberEhcacheStorage implements OnlineMemberStorage {
public MetaConfig getMetaConfig() {
return metaConfig;
}
/**
* 序列化会员信息到Cookie中
*
* @param cookieValue cookie中保存的值
* @param expireDateTime cookie到期的日期
* @param request Http请求对象
* @param response Http响应对象
* @param cookieSymbol cookie的Key
* @param cookiePath cookie的路径
* @param cookieDomain cookie的域名
* @param isHttps work on HTTPS/true,false work on http
*/
protected void serializeCookie(
String cookieValue,
LocalDateTime expireDateTime,
HttpServletRequest request,
HttpServletResponse response,
String cookieSymbol,
String cookiePath,
String cookieDomain,
boolean isHttps) {
try {
CookieUtils.serializeCookie(cookieValue, expireDateTime, request, response, cookieSymbol, cookiePath, cookieDomain, isHttps);
} catch (IllegalStateException e) {
if (logger.isDebugEnabled()) {
logger.debug("[OM][CS]write cookie fail, reason: " + e.getMessage(), e);
}
}
}
/**
* 清空Cookie中的会员信息
*
* @param request Http请求对象
* @param response Http响应对象
* @param cookieSymbol cookie的Key
* @param cookiePath cookie的路径
* @param cookieDomain cookie的域名
*/
protected void expireCookie(
HttpServletRequest request,
HttpServletResponse response,
String cookieSymbol,
String cookiePath,
String cookieDomain) {
CookieUtils.expireCookie(request, response, cookieSymbol, cookiePath, cookieDomain);
}
/**
*
* @param stub 长度12位
* @param ipAddr ipv4
* @return
*/
private Optional<String> hash(String stub, String ipAddr){ //redis key的长度
if(!Commons.isNotBlank(stub) || !Commons.isNotBlank(ipAddr)){
return Optional.empty();
}
return Optional.of(stub);
}
private String rndStub(){
return java.util.UUID.randomUUID().toString().substring(24);
}
}
......@@ -7,7 +7,9 @@
http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.0.xsd
http://www.ehcache.org/v3/jsr107 http://www.ehcache.org/schema/ehcache-107-ext-3.0.xsd">
<service>
<jsr107:defaults enable-management="true" enable-statistics="true"/>
<jsr107:defaults enable-management="true" enable-statistics="true">
<jsr107:cache name="olMemberSession" template="olmsbTemplate"/>
</jsr107:defaults>
</service>
<persistence directory="/home/subpu/cache"></persistence>
<cache alias="boardgroupCache">
......@@ -34,4 +36,12 @@
<offheap unit="MB">20</offheap>
</resources>
</cache>
<cache-template name="olmsbTemplate">
<key-type copier="org.ehcache.impl.copy.SerializingCopier">java.lang.String</key-type>
<value-type copier="org.ehcache.impl.copy.SerializingCopier">com.apobates.forum.member.storage.core.MemberSessionBean</value-type>
<expiry>
<ttl unit="days">1</ttl>
</expiry>
<heap unit="entries">200</heap>
</cache-template>
</config>
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册