Commit 040cf240 authored by xc's avatar xc

shiro限定并发登录人数

parent 2d720f12
......@@ -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"));
......
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