Commit 040cf240 authored by xc's avatar xc

shiro限定并发登录人数

parent 2d720f12
...@@ -6,15 +6,10 @@ import cn.wisenergy.model.app.Staff; ...@@ -6,15 +6,10 @@ import cn.wisenergy.model.app.Staff;
import cn.wisenergy.model.app.User; import cn.wisenergy.model.app.User;
import cn.wisenergy.service.shir.cache.MySessionManager; import cn.wisenergy.service.shir.cache.MySessionManager;
import com.alibaba.fastjson.JSON; 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 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;
import org.apache.shiro.cache.Cache;
import org.apache.shiro.cache.CacheManager;
import org.apache.shiro.session.Session; import org.apache.shiro.session.Session;
import org.apache.shiro.session.mgt.DefaultSessionKey; import org.apache.shiro.session.mgt.DefaultSessionKey;
import org.apache.shiro.subject.Subject; import org.apache.shiro.subject.Subject;
...@@ -27,13 +22,9 @@ import javax.servlet.ServletRequest; ...@@ -27,13 +22,9 @@ import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.io.Serializable; import java.io.Serializable;
import java.util.Deque; import java.util.*;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@Slf4j @Slf4j
...@@ -79,6 +70,16 @@ public class KickoutSessionControlFilter extends AccessControlFilter{ ...@@ -79,6 +70,16 @@ public class KickoutSessionControlFilter extends AccessControlFilter{
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>();
HttpServletRequest httpServletRequest=(HttpServletRequest) request; HttpServletRequest httpServletRequest=(HttpServletRequest) request;
HttpServletResponse httpServletResponse = (HttpServletResponse) response; 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; HttpServletRequest request1 = (HttpServletRequest) request;
log.info("KickoutSessionControlFilter isAuthenticated {} .......",subject.isAuthenticated()); log.info("KickoutSessionControlFilter isAuthenticated {} .......",subject.isAuthenticated());
...@@ -87,27 +88,11 @@ public class KickoutSessionControlFilter extends AccessControlFilter{ ...@@ -87,27 +88,11 @@ public class KickoutSessionControlFilter extends AccessControlFilter{
if (!subject.isAuthenticated() && !subject.isRemembered()) { if (!subject.isAuthenticated() && !subject.isRemembered()) {
log.info("KickoutSessionControlFilter isAuthenticated and isRemembered Please login first ......."); log.info("KickoutSessionControlFilter isAuthenticated and isRemembered Please login first .......");
// 没有登陆,抛出异常 // 没有登陆,抛出异常
thrLogoutException(httpServletRequest,httpServletResponse, "1001", "Please login first"); thrLogoutException(httpServletRequest,httpServletResponse, "1001", "请先登录后再执行操作");
return false; return false;
} }
Session session = subject.getSession(); Session session = subject.getSession();
Serializable sessionId = session.getId(); 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"); log.info("KickoutSessionControlFilter 如果被踢出了,直接退出,重定向到踢出后的地址-----返回1002");
//如果被踢出了,直接退出,重定向到踢出后的地址 //如果被踢出了,直接退出,重定向到踢出后的地址
if (session.getAttribute("kickout") != null) { if (session.getAttribute("kickout") != null) {
...@@ -123,6 +108,7 @@ public class KickoutSessionControlFilter extends AccessControlFilter{ ...@@ -123,6 +108,7 @@ public class KickoutSessionControlFilter extends AccessControlFilter{
return false; return false;
} }
log.info("KickoutSessionControlFilter Not Login end......."); log.info("KickoutSessionControlFilter Not Login end.......");
redisTemplate.opsForValue().set("shiroSessionTime:"+userId, new Date().getTime());
return true; return true;
} }
...@@ -176,6 +162,7 @@ public class KickoutSessionControlFilter extends AccessControlFilter{ ...@@ -176,6 +162,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);
redisTemplate.opsForValue().set("shiroSessionTime:"+userId, new Date().getTime());
log.info("KickoutSessionControlFilter changeSession end......."); log.info("KickoutSessionControlFilter changeSession end.......");
} }
...@@ -207,6 +194,27 @@ public class KickoutSessionControlFilter extends AccessControlFilter{ ...@@ -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) { private void setHeader(HttpServletRequest request, HttpServletResponse response) {
//跨域的header设置 //跨域的header设置
response.setHeader("Access-control-Allow-Origin", request.getHeader("Origin")); response.setHeader("Access-control-Allow-Origin", request.getHeader("Origin"));
......
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