Commit 3dacc61f authored by xc's avatar xc

shiro限定并发登录人数

parent 88f22f8f
......@@ -9,6 +9,7 @@ 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;
......@@ -34,6 +35,7 @@ import java.util.LinkedList;
import java.util.Map;
import java.util.concurrent.TimeUnit;
@Slf4j
public class KickoutSessionControlFilter extends AccessControlFilter{
private final Logger logger = LoggerFactory.getLogger(KickoutSessionControlFilter.class);
private boolean kickoutAfter = false; //踢出之前登录的/之后登录的用户 默认踢出之前登录的用户
......@@ -78,12 +80,12 @@ public class KickoutSessionControlFilter extends AccessControlFilter{
@Override
protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
logger.info("KickoutSessionControlFilter Not Login begin.......");
log.info("KickoutSessionControlFilter Not Login begin.......");
Subject subject = getSubject(request, response);
Map<String, Object> map = new HashMap<>();
// 没有登陆或没有设置“记住我”
if (!subject.isAuthenticated() && !subject.isRemembered()) {
logger.info("KickoutSessionControlFilter isAuthenticated and isRemembered return true .......");
log.info("KickoutSessionControlFilter isAuthenticated and isRemembered return true .......");
return true;
}
Session session = subject.getSession();
......@@ -110,10 +112,10 @@ public class KickoutSessionControlFilter extends AccessControlFilter{
userId = staff.getId();
}
}
logger.info("KickoutSessionControlFilter 如果被踢出了,直接退出,重定向到踢出后的地址-----");
log.info("KickoutSessionControlFilter 如果被踢出了,直接退出,重定向到踢出后的地址-----");
//如果被踢出了,直接退出,重定向到踢出后的地址
if (session.getAttribute("kickout") != null) {
logger.info("------" + "踢出用户" + userId + "登录sessionId=" + sessionId + "------");
log.info("------" + "踢出用户" + userId + "登录sessionId=" + sessionId + "------");
//会话被踢出了
try {
//退出登录
......@@ -126,7 +128,7 @@ public class KickoutSessionControlFilter extends AccessControlFilter{
out(response, map);
return false;
}
logger.info("KickoutSessionControlFilter Not Login end.......");
log.info("KickoutSessionControlFilter Not Login end.......");
return true;
}
......@@ -146,7 +148,7 @@ public class KickoutSessionControlFilter extends AccessControlFilter{
public void changeSession(int type){
logger.info("KickoutSessionControlFilter changeSession begin.......type : "+type);
log.info("KickoutSessionControlFilter changeSession begin.......type : "+type);
Subject subject = SecurityUtils.getSubject();
Session session = subject.getSession();
session.setTimeout(300000);
......@@ -176,6 +178,7 @@ public class KickoutSessionControlFilter extends AccessControlFilter{
//如果队列里的sessionId数超出最大会话数,开始踢人
while (deque.size() > maxSession) {
Serializable kickoutSessionId = kickoutAfter?deque.removeFirst():deque.removeLast();
log.info("KickoutSessionControlFilter changeSession kickoutSessionId {} ......."+kickoutSessionId,kickoutSessionId);
try {
//获取被踢出的sessionId的session对象
Session kickoutSession = sessionManager.getSession(new DefaultSessionKey(kickoutSessionId));
......@@ -188,7 +191,7 @@ public class KickoutSessionControlFilter extends AccessControlFilter{
}
// 更新redis中的用户登录队列
redisTemplate.opsForValue().set(getRedisKickoutKey(userId), deque, EXPIRE_TIME, TimeUnit.SECONDS);
logger.info("KickoutSessionControlFilter changeSession end.......");
log.info("KickoutSessionControlFilter changeSession end.......");
}
String getRedisKickoutKey(Integer userId) {
......@@ -209,7 +212,7 @@ public class KickoutSessionControlFilter extends AccessControlFilter{
writer.flush();
} catch (Exception e) {
IOUtils.closeQuietly(writer);
logger.error("接口异常:{}"+ExceptionUtils.getFullStackTrace(e));
log.error("接口异常:{}"+ExceptionUtils.getFullStackTrace(e));
} finally {
if (writer != null) {
writer.close();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment