Commit 3dacc61f authored by xc's avatar xc

shiro限定并发登录人数

parent 88f22f8f
...@@ -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 {
logger.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()) {
logger.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();
} }
} }
logger.info("KickoutSessionControlFilter 如果被踢出了,直接退出,重定向到踢出后的地址-----"); log.info("KickoutSessionControlFilter 如果被踢出了,直接退出,重定向到踢出后的地址-----");
//如果被踢出了,直接退出,重定向到踢出后的地址 //如果被踢出了,直接退出,重定向到踢出后的地址
if (session.getAttribute("kickout") != null) { if (session.getAttribute("kickout") != null) {
logger.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;
} }
logger.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){
logger.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);
logger.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);
logger.error("接口异常:{}"+ExceptionUtils.getFullStackTrace(e)); log.error("接口异常:{}"+ExceptionUtils.getFullStackTrace(e));
} finally { } finally {
if (writer != null) { if (writer != null) {
writer.close(); 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