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
3dacc61f
Commit
3dacc61f
authored
Apr 10, 2021
by
xc
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
shiro限定并发登录人数
parent
88f22f8f
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
11 additions
and
8 deletions
+11
-8
KickoutSessionControlFilter.java
...ergy/service/shir/filter/KickoutSessionControlFilter.java
+11
-8
No files found.
wisenergy-service/src/main/java/cn/wisenergy/service/shir/filter/KickoutSessionControlFilter.java
View file @
3dacc61f
...
@@ -9,6 +9,7 @@ import com.alibaba.fastjson.JSON;
...
@@ -9,6 +9,7 @@ import com.alibaba.fastjson.JSON;
import
com.alibaba.fastjson.serializer.SerializerFeature
;
import
com.alibaba.fastjson.serializer.SerializerFeature
;
import
com.itextpdf.text.log.Logger
;
import
com.itextpdf.text.log.Logger
;
import
com.itextpdf.text.log.LoggerFactory
;
import
com.itextpdf.text.log.LoggerFactory
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.io.IOUtils
;
import
org.apache.commons.io.IOUtils
;
import
org.apache.commons.lang.exception.ExceptionUtils
;
import
org.apache.commons.lang.exception.ExceptionUtils
;
import
org.apache.shiro.SecurityUtils
;
import
org.apache.shiro.SecurityUtils
;
...
@@ -34,6 +35,7 @@ import java.util.LinkedList;
...
@@ -34,6 +35,7 @@ import java.util.LinkedList;
import
java.util.Map
;
import
java.util.Map
;
import
java.util.concurrent.TimeUnit
;
import
java.util.concurrent.TimeUnit
;
@Slf4j
public
class
KickoutSessionControlFilter
extends
AccessControlFilter
{
public
class
KickoutSessionControlFilter
extends
AccessControlFilter
{
private
final
Logger
logger
=
LoggerFactory
.
getLogger
(
KickoutSessionControlFilter
.
class
);
private
final
Logger
logger
=
LoggerFactory
.
getLogger
(
KickoutSessionControlFilter
.
class
);
private
boolean
kickoutAfter
=
false
;
//踢出之前登录的/之后登录的用户 默认踢出之前登录的用户
private
boolean
kickoutAfter
=
false
;
//踢出之前登录的/之后登录的用户 默认踢出之前登录的用户
...
@@ -78,12 +80,12 @@ public class KickoutSessionControlFilter extends AccessControlFilter{
...
@@ -78,12 +80,12 @@ public class KickoutSessionControlFilter extends AccessControlFilter{
@Override
@Override
protected
boolean
onAccessDenied
(
ServletRequest
request
,
ServletResponse
response
)
throws
Exception
{
protected
boolean
onAccessDenied
(
ServletRequest
request
,
ServletResponse
response
)
throws
Exception
{
log
ger
.
info
(
"KickoutSessionControlFilter Not Login begin......."
);
log
.
info
(
"KickoutSessionControlFilter Not Login begin......."
);
Subject
subject
=
getSubject
(
request
,
response
);
Subject
subject
=
getSubject
(
request
,
response
);
Map
<
String
,
Object
>
map
=
new
HashMap
<>();
Map
<
String
,
Object
>
map
=
new
HashMap
<>();
// 没有登陆或没有设置“记住我”
// 没有登陆或没有设置“记住我”
if
(!
subject
.
isAuthenticated
()
&&
!
subject
.
isRemembered
())
{
if
(!
subject
.
isAuthenticated
()
&&
!
subject
.
isRemembered
())
{
log
ger
.
info
(
"KickoutSessionControlFilter isAuthenticated and isRemembered return true ......."
);
log
.
info
(
"KickoutSessionControlFilter isAuthenticated and isRemembered return true ......."
);
return
true
;
return
true
;
}
}
Session
session
=
subject
.
getSession
();
Session
session
=
subject
.
getSession
();
...
@@ -110,10 +112,10 @@ public class KickoutSessionControlFilter extends AccessControlFilter{
...
@@ -110,10 +112,10 @@ public class KickoutSessionControlFilter extends AccessControlFilter{
userId
=
staff
.
getId
();
userId
=
staff
.
getId
();
}
}
}
}
log
ger
.
info
(
"KickoutSessionControlFilter 如果被踢出了,直接退出,重定向到踢出后的地址-----"
);
log
.
info
(
"KickoutSessionControlFilter 如果被踢出了,直接退出,重定向到踢出后的地址-----"
);
//如果被踢出了,直接退出,重定向到踢出后的地址
//如果被踢出了,直接退出,重定向到踢出后的地址
if
(
session
.
getAttribute
(
"kickout"
)
!=
null
)
{
if
(
session
.
getAttribute
(
"kickout"
)
!=
null
)
{
log
ger
.
info
(
"------"
+
"踢出用户"
+
userId
+
"登录sessionId="
+
sessionId
+
"------"
);
log
.
info
(
"------"
+
"踢出用户"
+
userId
+
"登录sessionId="
+
sessionId
+
"------"
);
//会话被踢出了
//会话被踢出了
try
{
try
{
//退出登录
//退出登录
...
@@ -126,7 +128,7 @@ public class KickoutSessionControlFilter extends AccessControlFilter{
...
@@ -126,7 +128,7 @@ public class KickoutSessionControlFilter extends AccessControlFilter{
out
(
response
,
map
);
out
(
response
,
map
);
return
false
;
return
false
;
}
}
log
ger
.
info
(
"KickoutSessionControlFilter Not Login end......."
);
log
.
info
(
"KickoutSessionControlFilter Not Login end......."
);
return
true
;
return
true
;
}
}
...
@@ -146,7 +148,7 @@ public class KickoutSessionControlFilter extends AccessControlFilter{
...
@@ -146,7 +148,7 @@ public class KickoutSessionControlFilter extends AccessControlFilter{
public
void
changeSession
(
int
type
){
public
void
changeSession
(
int
type
){
log
ger
.
info
(
"KickoutSessionControlFilter changeSession begin.......type : "
+
type
);
log
.
info
(
"KickoutSessionControlFilter changeSession begin.......type : "
+
type
);
Subject
subject
=
SecurityUtils
.
getSubject
();
Subject
subject
=
SecurityUtils
.
getSubject
();
Session
session
=
subject
.
getSession
();
Session
session
=
subject
.
getSession
();
session
.
setTimeout
(
300000
);
session
.
setTimeout
(
300000
);
...
@@ -176,6 +178,7 @@ public class KickoutSessionControlFilter extends AccessControlFilter{
...
@@ -176,6 +178,7 @@ public class KickoutSessionControlFilter extends AccessControlFilter{
//如果队列里的sessionId数超出最大会话数,开始踢人
//如果队列里的sessionId数超出最大会话数,开始踢人
while
(
deque
.
size
()
>
maxSession
)
{
while
(
deque
.
size
()
>
maxSession
)
{
Serializable
kickoutSessionId
=
kickoutAfter
?
deque
.
removeFirst
():
deque
.
removeLast
();
Serializable
kickoutSessionId
=
kickoutAfter
?
deque
.
removeFirst
():
deque
.
removeLast
();
log
.
info
(
"KickoutSessionControlFilter changeSession kickoutSessionId {} ......."
+
kickoutSessionId
,
kickoutSessionId
);
try
{
try
{
//获取被踢出的sessionId的session对象
//获取被踢出的sessionId的session对象
Session
kickoutSession
=
sessionManager
.
getSession
(
new
DefaultSessionKey
(
kickoutSessionId
));
Session
kickoutSession
=
sessionManager
.
getSession
(
new
DefaultSessionKey
(
kickoutSessionId
));
...
@@ -188,7 +191,7 @@ public class KickoutSessionControlFilter extends AccessControlFilter{
...
@@ -188,7 +191,7 @@ public class KickoutSessionControlFilter extends AccessControlFilter{
}
}
// 更新redis中的用户登录队列
// 更新redis中的用户登录队列
redisTemplate
.
opsForValue
().
set
(
getRedisKickoutKey
(
userId
),
deque
,
EXPIRE_TIME
,
TimeUnit
.
SECONDS
);
redisTemplate
.
opsForValue
().
set
(
getRedisKickoutKey
(
userId
),
deque
,
EXPIRE_TIME
,
TimeUnit
.
SECONDS
);
log
ger
.
info
(
"KickoutSessionControlFilter changeSession end......."
);
log
.
info
(
"KickoutSessionControlFilter changeSession end......."
);
}
}
String
getRedisKickoutKey
(
Integer
userId
)
{
String
getRedisKickoutKey
(
Integer
userId
)
{
...
@@ -209,7 +212,7 @@ public class KickoutSessionControlFilter extends AccessControlFilter{
...
@@ -209,7 +212,7 @@ public class KickoutSessionControlFilter extends AccessControlFilter{
writer
.
flush
();
writer
.
flush
();
}
catch
(
Exception
e
)
{
}
catch
(
Exception
e
)
{
IOUtils
.
closeQuietly
(
writer
);
IOUtils
.
closeQuietly
(
writer
);
log
ger
.
error
(
"接口异常:{}"
+
ExceptionUtils
.
getFullStackTrace
(
e
));
log
.
error
(
"接口异常:{}"
+
ExceptionUtils
.
getFullStackTrace
(
e
));
}
finally
{
}
finally
{
if
(
writer
!=
null
)
{
if
(
writer
!=
null
)
{
writer
.
close
();
writer
.
close
();
...
...
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