Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
X
xyqb-user2
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
head_group
xyqb-user2
Commits
1d5026c7
Commit
1d5026c7
authored
Jul 10, 2023
by
王亮
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
union query user.
parent
6d7cde82
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
236 additions
and
95 deletions
+236
-95
Constants.java
src/main/java/cn/quantgroup/xyqb/Constants.java
+1
-0
MyWebMvcConfigurer.java
...va/cn/quantgroup/xyqb/config/http/MyWebMvcConfigurer.java
+42
-38
BizExceptionEnum.java
...n/java/cn/quantgroup/xyqb/exception/BizExceptionEnum.java
+4
-0
InnerInterceptor.java
...main/java/cn/quantgroup/xyqb/filter/InnerInterceptor.java
+83
-0
TokenInterceptor.java
...main/java/cn/quantgroup/xyqb/filter/TokenInterceptor.java
+5
-3
SessionStruct.java
.../java/cn/quantgroup/xyqb/model/session/SessionStruct.java
+3
-0
StmsRemoteService.java
...ain/java/cn/quantgroup/xyqb/remote/StmsRemoteService.java
+7
-0
SessionServiceImpl.java
...ntgroup/xyqb/service/session/impl/SessionServiceImpl.java
+53
-50
XyqbSessionContextHolder.java
.../cn/quantgroup/xyqb/session/XyqbSessionContextHolder.java
+38
-4
No files found.
src/main/java/cn/quantgroup/xyqb/Constants.java
View file @
1d5026c7
...
...
@@ -37,6 +37,7 @@ public interface Constants {
String
X_AUTH_APP_ID
=
"qg-app-id"
;
String
X_AUTH_FROM
=
"qg-registered-from"
;
String
X_STMS_TOKEN
=
"qg-stms-token"
;
String
X_BEHAVIOR_TYPE
=
"qg-behavior-type"
;
String
X_BEHAVIOR_ID
=
"qg-behavior-id"
;
...
...
src/main/java/cn/quantgroup/xyqb/config/http/MyWebMvcConfigurer.java
View file @
1d5026c7
package
cn
.
quantgroup
.
xyqb
.
config
.
http
;
import
cn.quantgroup.xyqb.filter.BehaviorInterceptor
;
import
cn.quantgroup.xyqb.filter.InnerInterceptor
;
import
cn.quantgroup.xyqb.filter.TokenInterceptor
;
import
cn.quantgroup.xyqb.
service.captcha.IQuantgroupCaptcha
Service
;
import
cn.quantgroup.xyqb.
remote.StmsRemote
Service
;
import
cn.quantgroup.xyqb.service.session.ISessionService
;
import
cn.quantgroup.xyqb.service.v2.BehaviorContext
;
import
cn.quantgroup.xyqb.thirdparty.jcaptcha.AbstractManageableImageCaptchaService
;
import
org.hibernate.validator.HibernateValidator
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Qualifier
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.format.FormatterRegistry
;
import
org.springframework.stereotype.Component
;
...
...
@@ -23,39 +22,44 @@ import javax.validation.ValidatorFactory;
@Component
public
class
MyWebMvcConfigurer
extends
WebMvcConfigurerAdapter
{
@Autowired
private
ISessionService
sessionService
;
@Autowired
private
BehaviorContext
behaviorContext
;
@Override
public
void
addFormatters
(
FormatterRegistry
registry
)
{
registry
.
removeConvertible
(
String
.
class
,
Enum
.
class
);
registry
.
addConverterFactory
(
new
IntegerToEnumConverterFactory
());
}
/**
* 快速校验参数. 第一个出错后面的不用再校验了
*
* @return
*/
@Bean
public
MethodValidationPostProcessor
methodValidationPostProcessor
()
{
MethodValidationPostProcessor
postProcessor
=
new
MethodValidationPostProcessor
();
ValidatorFactory
validatorFactory
=
Validation
.
byProvider
(
HibernateValidator
.
class
)
.
configure
()
.
addProperty
(
"hibernate.validator.fail_fast"
,
"true"
)
.
buildValidatorFactory
();
Validator
validator
=
validatorFactory
.
getValidator
();
postProcessor
.
setValidator
(
validator
);
return
postProcessor
;
}
@Override
public
void
addInterceptors
(
InterceptorRegistry
registry
)
{
registry
.
addInterceptor
(
new
TokenInterceptor
(
sessionService
)).
addPathPatterns
(
"/v2/**"
)
.
excludePathPatterns
(
"/v2/behavior/code"
);
registry
.
addInterceptor
(
new
BehaviorInterceptor
(
behaviorContext
)).
addPathPatterns
(
"/v2/**"
,
"/api/v2"
)
.
excludePathPatterns
(
"/v2/behavior/code"
);
}
@Autowired
private
ISessionService
sessionService
;
@Autowired
private
BehaviorContext
behaviorContext
;
@Autowired
private
StmsRemoteService
stmsRemoteService
;
@Override
public
void
addFormatters
(
FormatterRegistry
registry
)
{
registry
.
removeConvertible
(
String
.
class
,
Enum
.
class
);
registry
.
addConverterFactory
(
new
IntegerToEnumConverterFactory
());
}
/**
* 快速校验参数. 第一个出错后面的不用再校验了
*
* @return
*/
@Bean
public
MethodValidationPostProcessor
methodValidationPostProcessor
()
{
MethodValidationPostProcessor
postProcessor
=
new
MethodValidationPostProcessor
();
ValidatorFactory
validatorFactory
=
Validation
.
byProvider
(
HibernateValidator
.
class
)
.
configure
()
.
addProperty
(
"hibernate.validator.fail_fast"
,
"true"
)
.
buildValidatorFactory
();
Validator
validator
=
validatorFactory
.
getValidator
();
postProcessor
.
setValidator
(
validator
);
return
postProcessor
;
}
@Override
public
void
addInterceptors
(
InterceptorRegistry
registry
)
{
registry
.
addInterceptor
(
new
TokenInterceptor
(
sessionService
)).
addPathPatterns
(
"/v2/**"
)
.
excludePathPatterns
(
"/v2/behavior/code"
);
registry
.
addInterceptor
(
new
BehaviorInterceptor
(
behaviorContext
)).
addPathPatterns
(
"/v2/**"
,
"/api/v2/**"
)
.
excludePathPatterns
(
"/v2/behavior/code"
);
registry
.
addInterceptor
(
new
InnerInterceptor
(
sessionService
,
stmsRemoteService
)).
addPathPatterns
(
"/api/v2/**"
);
}
}
\ No newline at end of file
src/main/java/cn/quantgroup/xyqb/exception/BizExceptionEnum.java
View file @
1d5026c7
...
...
@@ -21,6 +21,10 @@ public enum BizExceptionEnum {
ERROR_WECHAT_LOGIN
(
"1010"
,
"微信登录失败"
),
ERROR_INTERNAL_LOGIN
(
"1011"
,
"公开接口不能调用内部登录方式"
),
ERROR_LOGIN_PARAM
(
"1012"
,
"登录参数异常,请按接口文档对接"
),
UN_EXIT_STMS_TOKEN
(
"1013"
,
"stms的token不存在"
),
UN_VALID_STMS_TOKEN
(
"1014"
,
"无效的stms的token"
),
UN_PERMISSION_STMS
(
"1015"
,
"没有内部接口访问权限"
),
...
...
src/main/java/cn/quantgroup/xyqb/filter/InnerInterceptor.java
0 → 100644
View file @
1d5026c7
package
cn
.
quantgroup
.
xyqb
.
filter
;
import
cn.quantgroup.xyqb.Constants
;
import
cn.quantgroup.xyqb.exception.BizException
;
import
cn.quantgroup.xyqb.exception.BizExceptionEnum
;
import
cn.quantgroup.xyqb.model.OauthResult
;
import
cn.quantgroup.xyqb.model.session.SessionStruct
;
import
cn.quantgroup.xyqb.remote.StmsRemoteService
;
import
cn.quantgroup.xyqb.service.session.ISessionService
;
import
cn.quantgroup.xyqb.session.XyqbSessionContextHolder
;
import
cn.quantgroup.xyqb.util.StringUtils
;
import
com.alibaba.fastjson.JSONObject
;
import
org.springframework.web.servlet.HandlerInterceptor
;
import
org.springframework.web.servlet.ModelAndView
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
public
class
InnerInterceptor
implements
HandlerInterceptor
{
private
final
ISessionService
sessionService
;
private
final
StmsRemoteService
stmsRemoteService
;
public
InnerInterceptor
(
ISessionService
sessionService
,
StmsRemoteService
stmsRemoteService
)
{
this
.
sessionService
=
sessionService
;
this
.
stmsRemoteService
=
stmsRemoteService
;
}
@Override
public
boolean
preHandle
(
HttpServletRequest
request
,
HttpServletResponse
response
,
Object
handler
)
throws
Exception
{
//所有开放出去的外部接口,都需要验证租户id和注册来源
String
tenantId
=
request
.
getHeader
(
Constants
.
X_AUTH_TENANT
);
String
registeredFrom
=
request
.
getHeader
(
Constants
.
X_AUTH_FROM
);
String
stmsToken
=
request
.
getHeader
(
Constants
.
X_AUTH_TOKEN
);
if
(
StringUtils
.
isEmpty
(
tenantId
))
{
throw
new
BizException
(
BizExceptionEnum
.
UN_EXIT_TENANT_ID
);
}
if
(
StringUtils
.
isEmpty
(
registeredFrom
))
{
throw
new
BizException
(
BizExceptionEnum
.
UN_EXIT_REGISTERED_FROM
);
}
if
(
StringUtils
.
isEmpty
(
stmsToken
))
{
throw
new
BizException
(
BizExceptionEnum
.
UN_EXIT_STMS_TOKEN
);
}
SessionStruct
sessionStruct
=
XyqbSessionContextHolder
.
getXSessionFromRedis
(
stmsToken
);
if
(
sessionStruct
==
null
)
{
OauthResult
oauthResult
=
stmsRemoteService
.
checkToken
(
stmsToken
);
if
(
oauthResult
!=
null
&&
2000
==
oauthResult
.
getCode
())
{
OauthResult
permissionResult
=
stmsRemoteService
.
checkPermission
(
stmsToken
,
request
.
getRequestURI
(),
tenantId
);
if
(
permissionResult
!=
null
&&
2000
==
permissionResult
.
getCode
())
{
JSONObject
jsonObject
=
JSONObject
.
parseObject
((
String
)
permissionResult
.
getData
());
String
userId
=
jsonObject
.
getString
(
"id"
);
String
userName
=
jsonObject
.
getString
(
"name"
);
sessionStruct
=
XyqbSessionContextHolder
.
initSTMSSession
(
stmsToken
,
userId
,
userName
);
sessionService
.
persistSession
(
sessionStruct
.
getSid
(),
sessionStruct
.
getValues
(),
sessionStruct
.
getTenantId
());
}
else
{
throw
new
BizException
(
BizExceptionEnum
.
UN_PERMISSION_STMS
);
}
}
else
{
throw
new
BizException
(
BizExceptionEnum
.
UN_VALID_STMS_TOKEN
);
}
}
else
{
//session续期
sessionService
.
persistSession
(
sessionStruct
.
getSid
(),
sessionStruct
.
getValues
(),
sessionStruct
.
getTenantId
());
}
return
true
;
}
@Override
public
void
postHandle
(
HttpServletRequest
request
,
HttpServletResponse
response
,
Object
handler
,
ModelAndView
modelAndView
)
throws
Exception
{
}
@Override
public
void
afterCompletion
(
HttpServletRequest
request
,
HttpServletResponse
response
,
Object
handler
,
Exception
ex
)
throws
Exception
{
XyqbSessionContextHolder
.
releaseSession
();
}
}
src/main/java/cn/quantgroup/xyqb/filter/TokenInterceptor.java
View file @
1d5026c7
...
...
@@ -26,7 +26,7 @@ public class TokenInterceptor implements HandlerInterceptor {
@Override
public
boolean
preHandle
(
HttpServletRequest
request
,
HttpServletResponse
response
,
Object
handler
)
throws
Exception
{
//所有开放出去的外部接口,都
不
需要验证租户id和注册来源
//所有开放出去的外部接口,都需要验证租户id和注册来源
String
tenantId
=
request
.
getHeader
(
Constants
.
X_AUTH_TENANT
);
String
registered_from
=
request
.
getHeader
(
Constants
.
X_AUTH_FROM
);
if
(
StringUtils
.
isEmpty
(
tenantId
))
{
...
...
@@ -39,7 +39,7 @@ public class TokenInterceptor implements HandlerInterceptor {
//如果不再排查excludes的接口,需要进一步校验token(说明这些接口需要登录)
SessionStruct
sessionStruct
=
XyqbSessionContextHolder
.
getXSessionFromRedis
();
if
(!
excludes
.
contains
(
request
.
getRequestURI
()))
{
if
(
sessionStruct
==
null
)
{
if
(
sessionStruct
==
null
)
{
throw
new
BizException
(
BizExceptionEnum
.
UN_AUTHORIZED
);
}
else
{
//session续期
...
...
@@ -48,7 +48,9 @@ public class TokenInterceptor implements HandlerInterceptor {
}
else
{
//如果是排除的接口,同时sessionStruct为空,这时候初始化租户和来源字段
if
(
sessionStruct
==
null
)
{
XyqbSessionContextHolder
.
initXSession
();
sessionStruct
=
XyqbSessionContextHolder
.
initXSession
();
sessionService
.
persistSession
(
sessionStruct
.
getSid
(),
sessionStruct
.
getValues
(),
sessionStruct
.
getTenantId
());
}
}
...
...
src/main/java/cn/quantgroup/xyqb/model/session/SessionStruct.java
View file @
1d5026c7
...
...
@@ -28,6 +28,9 @@ public class SessionStruct implements Serializable {
private
String
scDeviceId
;
private
String
terminal
;
private
String
stmsUserId
;
private
String
stmsUserName
;
public
void
setAttribute
(
String
key
,
String
value
)
{
if
(
value
==
null
)
{
...
...
src/main/java/cn/quantgroup/xyqb/remote/StmsRemoteService.java
View file @
1d5026c7
...
...
@@ -2,11 +2,18 @@ package cn.quantgroup.xyqb.remote;
import
cn.quantgroup.xyqb.model.OauthResult
;
import
org.springframework.cloud.netflix.feign.FeignClient
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.PostMapping
;
import
org.springframework.web.bind.annotation.RequestHeader
;
import
org.springframework.web.bind.annotation.RequestParam
;
@FeignClient
(
name
=
"stms"
,
url
=
"${stms.https}"
)
public
interface
StmsRemoteService
{
@PostMapping
(
"/v2/oauth/currentuserinfo"
)
OauthResult
checkToken
(
@RequestHeader
(
"Access-Token"
)
String
accessToken
);
@GetMapping
(
value
=
"/v2/oauth/permission"
)
OauthResult
checkPermission
(
@RequestHeader
(
"Access-Token"
)
String
accessToken
,
@RequestHeader
(
"Referer"
)
String
referer
,
@RequestParam
(
"tenantId"
)
String
tenantId
);
}
src/main/java/cn/quantgroup/xyqb/service/session/impl/SessionServiceImpl.java
View file @
1d5026c7
package
cn
.
quantgroup
.
xyqb
.
service
.
session
.
impl
;
import
cn.quantgroup.xyqb.constant.enums.RecordType
;
import
cn.quantgroup.xyqb.Constants
;
import
cn.quantgroup.xyqb.constant.enums.RecordType
;
import
cn.quantgroup.xyqb.entity.User
;
import
cn.quantgroup.xyqb.entity.UserTag
;
import
cn.quantgroup.xyqb.event.UserLoginEvent
;
...
...
@@ -36,7 +36,6 @@ import java.util.concurrent.TimeUnit;
/**
* session创建和续期
*
*/
@Slf4j
@Service
...
...
@@ -64,22 +63,22 @@ public class SessionServiceImpl implements ISessionService {
* @return
*/
@Override
public
AuthBean
createSession
(
User
user
,
LoginProperties
properties
,
int
loginType
,
Integer
tenantId
)
{
public
AuthBean
createSession
(
User
user
,
LoginProperties
properties
,
int
loginType
,
Integer
tenantId
)
{
//找到用户
//TODO: 使用userId
String
sessionId
=
findSessionIdByUserIdLoginProperties
(
user
.
getId
(),
properties
,
tenantId
);
String
sessionId
=
findSessionIdByUserIdLoginProperties
(
user
.
getId
(),
properties
,
tenantId
);
SessionStruct
sessionStruct
=
null
;
if
(
StringUtils
.
isNotEmpty
(
sessionId
))
{
sessionStruct
=
findSessionBySessionId
(
sessionId
,
tenantId
);
sessionStruct
=
findSessionBySessionId
(
sessionId
,
tenantId
);
}
if
(
Objects
.
nonNull
(
sessionStruct
)
&&
Objects
.
nonNull
(
properties
))
{
sessionStruct
.
setAttribute
(
"channelId"
,
String
.
valueOf
(
properties
.
getChannelId
()));
sessionStruct
.
setAttribute
(
"createdFrom"
,
String
.
valueOf
(
properties
.
getCreatedFrom
()));
sessionStruct
.
setAttribute
(
"appChannel"
,
String
.
valueOf
(
properties
.
getAppChannel
()));
sessionStruct
.
getValues
().
setLoginProperties
(
properties
);
persistSession
(
sessionStruct
.
getSid
(),
sessionStruct
.
getValues
(),
tenantId
);
persistSession
(
sessionStruct
.
getSid
(),
sessionStruct
.
getValues
(),
tenantId
);
}
else
{
sessionStruct
=
createSessionAndPersist
(
user
,
properties
,
tenantId
);
sessionStruct
=
createSessionAndPersist
(
user
,
properties
,
tenantId
);
}
String
uuid
=
user
.
getUuid
();
AuthBean
authBean
=
new
AuthBean
();
...
...
@@ -100,27 +99,27 @@ public class SessionServiceImpl implements ISessionService {
}
@Override
public
SessionStruct
createSessionAndPersist
(
User
user
,
LoginProperties
properties
,
Integer
tenantId
)
{
public
SessionStruct
createSessionAndPersist
(
User
user
,
LoginProperties
properties
,
Integer
tenantId
)
{
SessionStruct
sessionStruct
;
//获取sessionid
String
sessionId
=
findSessionIdByUserIdLoginProperties
(
user
.
getId
(),
properties
,
tenantId
);
String
sessionId
=
findSessionIdByUserIdLoginProperties
(
user
.
getId
(),
properties
,
tenantId
);
if
(
StringUtils
.
length
(
sessionId
)
>
0
)
{
sessionStruct
=
findSessionBySessionId
(
sessionId
,
tenantId
);
sessionStruct
=
findSessionBySessionId
(
sessionId
,
tenantId
);
if
(
sessionStruct
==
null
)
{
sessionStruct
=
newSession
(
user
,
properties
);
}
else
{
sessionStruct
.
getValues
().
setLoginProperties
(
properties
);
}
persistSession
(
sessionStruct
.
getSid
(),
sessionStruct
.
getValues
(),
tenantId
);
persistSession
(
sessionStruct
.
getSid
(),
sessionStruct
.
getValues
(),
tenantId
);
}
else
{
sessionStruct
=
newSession
(
user
,
properties
);
persistSession
(
sessionStruct
.
getSid
(),
sessionStruct
.
getValues
(),
tenantId
);
persistSession
(
sessionStruct
.
getSid
(),
sessionStruct
.
getValues
(),
tenantId
);
}
return
sessionStruct
;
}
private
String
findSessionIdByUserIdLoginProperties
(
Long
userId
,
LoginProperties
properties
,
Integer
tenantId
)
{
return
stringRedisTemplate
.
opsForValue
().
get
(
generateLoginPropertiesKey
(
userId
,
properties
,
tenantId
));
private
String
findSessionIdByUserIdLoginProperties
(
Long
userId
,
LoginProperties
properties
,
Integer
tenantId
)
{
return
stringRedisTemplate
.
opsForValue
().
get
(
generateLoginPropertiesKey
(
userId
,
properties
,
tenantId
));
}
/**
...
...
@@ -130,17 +129,17 @@ public class SessionServiceImpl implements ISessionService {
* @param properties baitiao/xyqb/vcc ... + 用户注册来源
* @return redisKey. 用来标识这个渠道的用户 Session 是否存在
*/
private
String
generateLoginPropertiesKey
(
Long
userId
,
LoginProperties
properties
,
Integer
tenantId
)
{
private
String
generateLoginPropertiesKey
(
Long
userId
,
LoginProperties
properties
,
Integer
tenantId
)
{
if
(
ObjectUtils
.
isEmpty
(
properties
.
getTenantId
()))
{
return
Constants
.
Session
.
USER_SESSION_ID_CACHE
+
":"
+
userId
+
":"
+
properties
.
getMerchantName
()
+
":"
+
properties
.
getCreatedFrom
();
}
else
if
(
properties
.
getTenantId
().
equals
(
0
)
||
TenantUtil
.
TENANT_DEFAULT
.
equals
(
properties
.
getTenantId
()))
{
}
else
if
(
properties
.
getTenantId
().
equals
(
0
)
||
TenantUtil
.
TENANT_DEFAULT
.
equals
(
properties
.
getTenantId
()))
{
return
Constants
.
Session
.
USER_SESSION_ID_CACHE
+
":"
+
userId
+
":"
+
properties
.
getMerchantName
()
+
":"
+
properties
.
getCreatedFrom
();
}
else
{
}
else
{
return
Constants
.
Session
.
USER_SESSION_ID_CACHE
+
":"
+
userId
+
":"
+
properties
.
getMerchantName
()
+
":"
+
properties
.
getCreatedFrom
()
+
":"
+
properties
.
getTenantId
();
}
}
private
String
findSessionValueBySessionId
(
String
sessionId
,
Integer
tenantId
)
{
private
String
findSessionValueBySessionId
(
String
sessionId
,
Integer
tenantId
)
{
String
result
=
stringRedisTemplate
.
opsForValue
().
get
(
Constants
.
Session
.
USER_SESSION_CACHE
+
sessionId
);
return
StringUtils
.
defaultString
(
result
,
""
);
}
...
...
@@ -173,21 +172,26 @@ public class SessionServiceImpl implements ISessionService {
@Override
@UserBtRegisterFill
public
void
persistSession
(
String
token
,
SessionValue
sessionValue
,
Integer
tenantId
)
{
persistSession
(
token
,
sessionValue
,
Constants
.
Session
.
SESSION_VALID_TIME
,
tenantId
);
public
void
persistSession
(
String
token
,
SessionValue
sessionValue
,
Integer
tenantId
)
{
persistSession
(
token
,
sessionValue
,
Constants
.
Session
.
SESSION_VALID_TIME
,
tenantId
);
}
@Override
public
void
persistSession
(
String
token
,
SessionValue
sessionValue
,
Long
time
,
Integer
tenantId
)
{
public
void
persistSession
(
String
token
,
SessionValue
sessionValue
,
Long
time
,
Integer
tenantId
)
{
Timestamp
current
=
new
Timestamp
(
System
.
currentTimeMillis
());
if
(
sessionValue
==
null
)
{
sessionValue
=
new
SessionValue
();
}
sessionValue
.
setLastAccessTime
(
current
);
String
json
=
JSON
.
toJSONString
(
sessionValue
);
stringRedisTemplate
.
opsForValue
().
set
(
Constants
.
Session
.
USER_SESSION_CACHE
+
token
,
json
,
time
,
TimeUnit
.
SECONDS
);
String
key
=
generateLoginPropertiesKey
(
sessionValue
.
getUser
().
getId
(),
sessionValue
.
getLoginProperties
(),
tenantId
);
stringRedisTemplate
.
opsForValue
().
set
(
key
,
token
,
time
,
TimeUnit
.
SECONDS
);
log
.
info
(
"[Session生命期延续],token:{},有效期:[24Hour]"
,
token
);
setUserIdTokenKeys
(
sessionValue
.
getUser
().
getId
(),
key
,
tenantId
);
if
(
sessionValue
.
getUser
()!=
null
){
String
key
=
generateLoginPropertiesKey
(
sessionValue
.
getUser
().
getId
(),
sessionValue
.
getLoginProperties
(),
tenantId
);
stringRedisTemplate
.
opsForValue
().
set
(
key
,
token
,
time
,
TimeUnit
.
SECONDS
);
log
.
info
(
"[Session生命期延续],token:{},有效期:[24Hour]"
,
token
);
setUserIdTokenKeys
(
sessionValue
.
getUser
().
getId
(),
key
,
tenantId
);
}
}
/**
...
...
@@ -196,9 +200,9 @@ public class SessionServiceImpl implements ISessionService {
* @param userId
* @param key
*/
private
void
setUserIdTokenKeys
(
long
userId
,
String
key
,
Integer
tenantId
)
{
private
void
setUserIdTokenKeys
(
long
userId
,
String
key
,
Integer
tenantId
)
{
if
(
0L
!=
userId
)
{
String
setKey
=
getUserSessionSetKey
(
userId
,
tenantId
);
String
setKey
=
getUserSessionSetKey
(
userId
,
tenantId
);
try
{
stringRedisTemplate
.
opsForSet
().
add
(
setKey
,
key
);
stringRedisTemplate
.
expire
(
setKey
,
Constants
.
Session
.
SESSION_VALID_TIME
,
TimeUnit
.
SECONDS
);
...
...
@@ -209,8 +213,8 @@ public class SessionServiceImpl implements ISessionService {
}
}
private
SessionStruct
findSessionBySessionId
(
String
sessionId
,
Integer
tenantId
)
{
String
sessionValue
=
findSessionValueBySessionId
(
sessionId
,
tenantId
);
private
SessionStruct
findSessionBySessionId
(
String
sessionId
,
Integer
tenantId
)
{
String
sessionValue
=
findSessionValueBySessionId
(
sessionId
,
tenantId
);
if
(
StringUtils
.
isEmpty
(
sessionValue
))
{
log
.
warn
(
"[SessionServiceImpl][findSessionBySessionId] session data 未找到:sid:{}"
,
sessionId
);
return
null
;
...
...
@@ -234,15 +238,15 @@ public class SessionServiceImpl implements ISessionService {
@Override
@CacheEvict
(
value
=
"userextinfocache"
,
key
=
"'extinfo' + #userId"
,
cacheManager
=
"cacheManager"
)
public
void
deleteByUserId
(
long
userId
,
Integer
tenantId
)
{
public
void
deleteByUserId
(
long
userId
,
Integer
tenantId
)
{
//1.删除session关联
String
setKey
=
getUserSessionSetKey
(
userId
,
tenantId
);
String
setKey
=
getUserSessionSetKey
(
userId
,
tenantId
);
Set
useIdKeys
=
stringRedisTemplate
.
opsForSet
().
members
(
setKey
);
if
(!
CollectionUtils
.
isEmpty
(
useIdKeys
))
{
useIdKeys
.
forEach
(
key
->
{
log
.
info
(
"删除用户userId={}的缓存信息"
,
userId
);
String
token
=
stringRedisTemplate
.
opsForValue
().
get
(
String
.
valueOf
(
key
));
stringRedisTemplate
.
delete
(
getUserTokenKey
(
token
,
tenantId
));
stringRedisTemplate
.
delete
(
getUserTokenKey
(
token
,
tenantId
));
stringRedisTemplate
.
delete
(
String
.
valueOf
(
key
));
});
//2.删除session缓存健
...
...
@@ -250,7 +254,7 @@ public class SessionServiceImpl implements ISessionService {
}
}
private
String
getUserTokenKey
(
String
token
,
Integer
tenantId
)
{
private
String
getUserTokenKey
(
String
token
,
Integer
tenantId
)
{
return
Constants
.
Session
.
USER_SESSION_CACHE
+
token
;
}
...
...
@@ -266,39 +270,39 @@ public class SessionServiceImpl implements ISessionService {
@CacheEvict
(
value
=
"userSpouseCache"
,
key
=
"'spouse' + #user.id"
,
cacheManager
=
"cacheManager"
),
@CacheEvict
(
value
=
"btRegisterCache"
,
key
=
"'userId' + #user.id"
,
cacheManager
=
"cacheManager"
)})
@Override
public
void
deleteUserCatch
(
User
user
,
Integer
tenantId
)
{
public
void
deleteUserCatch
(
User
user
,
Integer
tenantId
)
{
}
@Override
public
List
<
SessionStruct
>
findByUserId
(
long
userId
,
Integer
tenantId
)
{
public
List
<
SessionStruct
>
findByUserId
(
long
userId
,
Integer
tenantId
)
{
List
<
SessionStruct
>
sessionStructList
=
new
ArrayList
<>();
String
setKey
=
getUserSessionSetKey
(
userId
,
tenantId
);
String
setKey
=
getUserSessionSetKey
(
userId
,
tenantId
);
Set
<
String
>
userIdKeys
=
stringRedisTemplate
.
opsForSet
().
members
(
setKey
);
if
(
CollectionUtils
.
isEmpty
(
userIdKeys
))
{
return
sessionStructList
;
}
for
(
String
userIdKey
:
userIdKeys
)
{
String
sessionId
=
stringRedisTemplate
.
opsForValue
().
get
(
userIdKey
);
SessionStruct
sessionStruct
=
findSessionBySessionId
(
sessionId
,
tenantId
);
SessionStruct
sessionStruct
=
findSessionBySessionId
(
sessionId
,
tenantId
);
sessionStructList
.
add
(
sessionStruct
);
}
return
sessionStructList
;
}
@Override
public
void
persistSession
(
List
<
SessionStruct
>
sessionStructList
,
Integer
tenantId
)
{
public
void
persistSession
(
List
<
SessionStruct
>
sessionStructList
,
Integer
tenantId
)
{
for
(
SessionStruct
sessionStruct
:
sessionStructList
)
{
String
sid
=
sessionStruct
.
getSid
();
SessionValue
values
=
sessionStruct
.
getValues
();
persistSession
(
sid
,
values
,
tenantId
);
persistSession
(
sid
,
values
,
tenantId
);
}
}
@Override
public
void
deleteSession
(
String
token
,
Integer
tenantId
)
{
public
void
deleteSession
(
String
token
,
Integer
tenantId
)
{
SessionStruct
sessionStruct
=
findSessionBySessionId
(
token
,
tenantId
);
SessionStruct
sessionStruct
=
findSessionBySessionId
(
token
,
tenantId
);
if
(
null
!=
sessionStruct
)
{
...
...
@@ -308,7 +312,7 @@ public class SessionServiceImpl implements ISessionService {
User
user
=
values
.
getUser
();
String
key
=
generateLoginPropertiesKey
(
user
.
getId
(),
values
.
getLoginProperties
(),
tenantId
);
String
key
=
generateLoginPropertiesKey
(
user
.
getId
(),
values
.
getLoginProperties
(),
tenantId
);
stringRedisTemplate
.
delete
(
key
);
...
...
@@ -317,37 +321,36 @@ public class SessionServiceImpl implements ISessionService {
}
@Override
public
void
persistSessionExchange
(
String
token
,
SessionValue
sessionValue
,
long
expire
,
Integer
tenantId
)
{
public
void
persistSessionExchange
(
String
token
,
SessionValue
sessionValue
,
long
expire
,
Integer
tenantId
)
{
Timestamp
current
=
new
Timestamp
(
System
.
currentTimeMillis
());
sessionValue
.
setLastAccessTime
(
current
);
String
json
=
JSON
.
toJSONString
(
sessionValue
);
stringRedisTemplate
.
opsForValue
().
set
(
Constants
.
Session
.
USER_SESSION_CACHE
+
token
,
json
,
Constants
.
Session
.
SESSION_VALID_TIME
,
TimeUnit
.
SECONDS
);
String
key
=
generateLoginPropertiesKey
(
sessionValue
.
getUser
().
getId
(),
sessionValue
.
getLoginProperties
(),
tenantId
);
String
key
=
generateLoginPropertiesKey
(
sessionValue
.
getUser
().
getId
(),
sessionValue
.
getLoginProperties
(),
tenantId
);
stringRedisTemplate
.
opsForValue
().
set
(
key
,
token
,
expire
,
TimeUnit
.
SECONDS
);
setUserIdTokenKeys
(
sessionValue
.
getUser
().
getId
(),
key
,
tenantId
);
setUserIdTokenKeys
(
sessionValue
.
getUser
().
getId
(),
key
,
tenantId
);
}
public
void
kdspDeleteSession
(
Long
userId
,
LoginProperties
loginProperties
,
Integer
tenantId
)
{
public
void
kdspDeleteSession
(
Long
userId
,
LoginProperties
loginProperties
,
Integer
tenantId
)
{
List
<
Long
>
createFromList
=
Arrays
.
asList
(
214L
,
217L
);
for
(
Long
createFrom
:
createFromList
)
{
loginProperties
.
setCreatedFrom
(
createFrom
);
String
key
=
generateLoginPropertiesKey
(
userId
,
loginProperties
,
tenantId
);
String
key
=
generateLoginPropertiesKey
(
userId
,
loginProperties
,
tenantId
);
String
token
=
stringRedisTemplate
.
opsForValue
().
get
(
key
);
deleteSession
(
token
,
tenantId
);
deleteSession
(
token
,
tenantId
);
}
}
/**
* 获取用户的会话缓存Set的Redis-Key
*
* @param userId - 用户主键
* @return
*/
private
String
getUserSessionSetKey
(
long
userId
,
Integer
tenantId
)
{
private
String
getUserSessionSetKey
(
long
userId
,
Integer
tenantId
)
{
return
Constants
.
Session
.
USER_SESSION_KEY_SET
+
userId
;
}
}
src/main/java/cn/quantgroup/xyqb/session/XyqbSessionContextHolder.java
View file @
1d5026c7
...
...
@@ -37,9 +37,9 @@ public class XyqbSessionContextHolder {
return
sessionStruct
;
}
public
static
void
initXSession
()
{
SessionStruct
sessionStruct
;
if
(
threadSession
.
get
()
==
null
)
{
public
static
SessionStruct
initXSession
()
{
SessionStruct
sessionStruct
=
threadSession
.
get
()
;
if
(
sessionStruct
==
null
)
{
sessionStruct
=
new
SessionStruct
();
HttpServletRequest
request
=
((
ServletRequestAttributes
)
RequestContextHolder
.
getRequestAttributes
()).
getRequest
();
...
...
@@ -56,9 +56,43 @@ public class XyqbSessionContextHolder {
sessionStruct
.
setGeetestId
(
geetestId
);
}
sessionStruct
.
setScDeviceId
(
request
.
getHeader
(
"scDeviceId"
));
sessionStruct
.
setTerminal
(
request
.
getHeader
(
"terminal"
));
sessionStruct
.
setTerminal
(
request
.
getHeader
(
"terminal"
));
threadSession
.
set
(
sessionStruct
);
}
else
{
HttpServletRequest
request
=
((
ServletRequestAttributes
)
RequestContextHolder
.
getRequestAttributes
()).
getRequest
();
//如果是极验,那赋值
if
(
request
.
getHeader
(
Constants
.
X_BEHAVIOR_TYPE
)
!=
null
&&
"1"
.
equals
(
request
.
getHeader
(
Constants
.
X_BEHAVIOR_TYPE
)))
{
String
geetestId
=
request
.
getHeader
(
Constants
.
X_BEHAVIOR_ID
);
sessionStruct
.
setGeetestId
(
geetestId
);
}
}
return
sessionStruct
;
}
public
static
SessionStruct
initSTMSSession
(
String
token
,
String
userId
,
String
userName
)
{
SessionStruct
sessionStruct
=
threadSession
.
get
();
if
(
sessionStruct
==
null
)
{
sessionStruct
=
new
SessionStruct
();
HttpServletRequest
request
=
((
ServletRequestAttributes
)
RequestContextHolder
.
getRequestAttributes
()).
getRequest
();
String
tenantId
=
request
.
getHeader
(
Constants
.
X_AUTH_TENANT
);
String
registered_from
=
request
.
getHeader
(
Constants
.
X_AUTH_FROM
);
String
ip
=
IpUtil
.
getRemoteIP
(
request
);
sessionStruct
.
setTenantId
(
Integer
.
valueOf
(
tenantId
));
sessionStruct
.
setRegisteredFrom
(
Long
.
valueOf
(
registered_from
));
sessionStruct
.
setIp
(
ip
);
sessionStruct
.
setScDeviceId
(
request
.
getHeader
(
"scDeviceId"
));
sessionStruct
.
setTerminal
(
request
.
getHeader
(
"terminal"
));
sessionStruct
.
setSid
(
token
);
sessionStruct
.
setStmsUserId
(
userId
);
sessionStruct
.
setStmsUserName
(
userName
);
threadSession
.
set
(
sessionStruct
);
}
else
{
sessionStruct
.
setStmsUserId
(
userId
);
sessionStruct
.
setStmsUserName
(
userName
);
}
return
sessionStruct
;
}
public
static
SessionStruct
getXSessionFromRedis
()
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment