Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
V
volunteer_service
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
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
licc
volunteer_service
Commits
040cf240
Commit
040cf240
authored
Apr 11, 2021
by
xc
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
shiro限定并发登录人数
parent
2d720f12
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
35 additions
and
27 deletions
+35
-27
KickoutSessionControlFilter.java
...ergy/service/shir/filter/KickoutSessionControlFilter.java
+35
-27
No files found.
wisenergy-service/src/main/java/cn/wisenergy/service/shir/filter/KickoutSessionControlFilter.java
View file @
040cf240
...
...
@@ -6,15 +6,10 @@ import cn.wisenergy.model.app.Staff;
import
cn.wisenergy.model.app.User
;
import
cn.wisenergy.service.shir.cache.MySessionManager
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.serializer.SerializerFeature
;
import
com.itextpdf.text.log.Logger
;
import
com.itextpdf.text.log.LoggerFactory
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.io.IOUtils
;
import
org.apache.commons.lang.exception.ExceptionUtils
;
import
org.apache.shiro.SecurityUtils
;
import
org.apache.shiro.cache.Cache
;
import
org.apache.shiro.cache.CacheManager
;
import
org.apache.shiro.session.Session
;
import
org.apache.shiro.session.mgt.DefaultSessionKey
;
import
org.apache.shiro.subject.Subject
;
...
...
@@ -27,13 +22,9 @@ import javax.servlet.ServletRequest;
import
javax.servlet.ServletResponse
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
java.io.IOException
;
import
java.io.PrintWriter
;
import
java.io.Serializable
;
import
java.util.Deque
;
import
java.util.HashMap
;
import
java.util.LinkedList
;
import
java.util.Map
;
import
java.util.*
;
import
java.util.concurrent.TimeUnit
;
@Slf4j
...
...
@@ -79,6 +70,16 @@ public class KickoutSessionControlFilter extends AccessControlFilter{
Map
<
String
,
Object
>
map
=
new
HashMap
<>();
HttpServletRequest
httpServletRequest
=(
HttpServletRequest
)
request
;
HttpServletResponse
httpServletResponse
=
(
HttpServletResponse
)
response
;
// 登录超时
Integer
userId
=
getUserId
();
Long
SessionTime
=
(
Long
)
redisTemplate
.
opsForValue
().
get
(
"shiroSessionTime:"
+
userId
);
log
.
info
(
"KickoutSessionControlFilter 账号id:{} 已登录时长:{} 秒"
,
userId
,(
new
Date
().
getTime
()-
SessionTime
)/
1000
);
if
((
new
Date
().
getTime
()-
SessionTime
)
>=
(
EXPIRE_TIME
*
1000
)){
log
.
info
(
"KickoutSessionControlFilter 登录已超时-----返回1003,账号id:{} 已登录时长:{} 分钟"
,
userId
,(
new
Date
().
getTime
()-
SessionTime
)/
1000
/
60
);
// 登录超时,抛出异常 Login timed out, please log in again
thrLogoutException
(
httpServletRequest
,
httpServletResponse
,
"1003"
,
"登录超时,请重新登录"
);
return
false
;
}
// 没有登陆或没有设置“记住我”
HttpServletRequest
request1
=
(
HttpServletRequest
)
request
;
log
.
info
(
"KickoutSessionControlFilter isAuthenticated {} ......."
,
subject
.
isAuthenticated
());
...
...
@@ -87,27 +88,11 @@ public class KickoutSessionControlFilter extends AccessControlFilter{
if
(!
subject
.
isAuthenticated
()
&&
!
subject
.
isRemembered
())
{
log
.
info
(
"KickoutSessionControlFilter isAuthenticated and isRemembered Please login first ......."
);
// 没有登陆,抛出异常
thrLogoutException
(
httpServletRequest
,
httpServletResponse
,
"1001"
,
"
Please login first
"
);
thrLogoutException
(
httpServletRequest
,
httpServletResponse
,
"1001"
,
"
请先登录后再执行操作
"
);
return
false
;
}
Session
session
=
subject
.
getSession
();
Serializable
sessionId
=
session
.
getId
();
Integer
userId
=
null
;
try
{
//客户端
User
user
=
(
User
)
SecurityUtils
.
getSubject
().
getPrincipal
();
userId
=
user
.
getId
();
}
catch
(
Exception
e
)
{
try
{
//管理端
AccountInfo
accountInfo
=
(
AccountInfo
)
SecurityUtils
.
getSubject
().
getPrincipal
();
userId
=
accountInfo
.
getId
();
}
catch
(
Exception
en
)
{
//员工端
Staff
staff
=
(
Staff
)
SecurityUtils
.
getSubject
().
getPrincipal
();
userId
=
staff
.
getId
();
}
}
log
.
info
(
"KickoutSessionControlFilter 如果被踢出了,直接退出,重定向到踢出后的地址-----返回1002"
);
//如果被踢出了,直接退出,重定向到踢出后的地址
if
(
session
.
getAttribute
(
"kickout"
)
!=
null
)
{
...
...
@@ -123,6 +108,7 @@ public class KickoutSessionControlFilter extends AccessControlFilter{
return
false
;
}
log
.
info
(
"KickoutSessionControlFilter Not Login end......."
);
redisTemplate
.
opsForValue
().
set
(
"shiroSessionTime:"
+
userId
,
new
Date
().
getTime
());
return
true
;
}
...
...
@@ -176,6 +162,7 @@ public class KickoutSessionControlFilter extends AccessControlFilter{
}
// 更新redis中的用户登录队列
redisTemplate
.
opsForValue
().
set
(
getRedisKickoutKey
(
userId
),
deque
,
EXPIRE_TIME
,
TimeUnit
.
SECONDS
);
redisTemplate
.
opsForValue
().
set
(
"shiroSessionTime:"
+
userId
,
new
Date
().
getTime
());
log
.
info
(
"KickoutSessionControlFilter changeSession end......."
);
}
...
...
@@ -207,6 +194,27 @@ public class KickoutSessionControlFilter extends AccessControlFilter{
}
}
}
private
Integer
getUserId
(){
Integer
userId
=
null
;
try
{
//客户端
User
user
=
(
User
)
SecurityUtils
.
getSubject
().
getPrincipal
();
userId
=
user
.
getId
();
}
catch
(
Exception
e
)
{
try
{
//管理端
AccountInfo
accountInfo
=
(
AccountInfo
)
SecurityUtils
.
getSubject
().
getPrincipal
();
userId
=
accountInfo
.
getId
();
}
catch
(
Exception
en
)
{
//员工端
Staff
staff
=
(
Staff
)
SecurityUtils
.
getSubject
().
getPrincipal
();
userId
=
staff
.
getId
();
}
}
return
userId
;
}
private
void
setHeader
(
HttpServletRequest
request
,
HttpServletResponse
response
)
{
//跨域的header设置
response
.
setHeader
(
"Access-control-Allow-Origin"
,
request
.
getHeader
(
"Origin"
));
...
...
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