Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
街头小贩
jforum
提交
62312ee4
J
jforum
项目概览
街头小贩
/
jforum
通知
2
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
J
jforum
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
62312ee4
编写于
10月 01, 2020
作者:
街头小贩
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
增加olMemberSession缓存
上级
fc252e6d
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
169 addition
and
9 deletion
+169
-9
member.storage/src/main/java/com/apobates/forum/member/storage/core/MemberSessionBeanConverter.java
...forum/member/storage/core/MemberSessionBeanConverter.java
+1
-0
trident/src/main/java/com/apobates/forum/member/storage/ehcache/OnlineMemberEhcacheStorage.java
...um/member/storage/ehcache/OnlineMemberEhcacheStorage.java
+157
-8
trident/src/main/resources/ehcache.xml
trident/src/main/resources/ehcache.xml
+11
-1
未找到文件。
member.storage/src/main/java/com/apobates/forum/member/storage/core/MemberSessionBeanConverter.java
浏览文件 @
62312ee4
...
...
@@ -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
()
+
""
);
...
...
trident/src/main/java/com/apobates/forum/member/storage/ehcache/OnlineMemberEhcacheStorage.java
浏览文件 @
62312ee4
...
...
@@ -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
);
}
}
trident/src/main/resources/ehcache.xml
浏览文件 @
62312ee4
...
...
@@ -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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录