需求:
springboot整合shiro项目。因为shiro只是一个Java安全框架,并不会做重复登录的拦截,当一个用户登录成功后(chrome登录),再用另外一个浏览器登录(IE登录)或者另外一台电脑进行登录,两个都会登录成功,两个不同的session。
预期目的:不允许重复登录,限定一个账号一个用户登陆,并且是挤掉前一个用户(踢出用户),保证一个帐号只能同时一个人使用,例如微信和qq等。
预设解决方法:当第二次登录时,把第一个session剔除
使用的技术其实是 shiro的自定义filter,在shiroConfig的ShiroFilterFactoryBean中使用的过滤规则,通过调用各自对应的filter方式集成,使用自定义filter实现并发登入控制,废话不多说上代码!!
1.首先写一个KickoutSessionControlFilter类继承AccessControlFilter类
package com.kalvan.web.shiro.interceptor;
import com.kalvan.web.shiro.user.ShiroUserInfo;
import lombok.extern.slf4j.Slf4j;
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.session.mgt.SessionManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.AccessControlFilter;
import org.apache.shiro.web.util.WebUtils;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import java.io.Serializable;
import java.util.Deque;
import java.util.LinkedList;
/**
* shiro 自定义filter 实现 并发登录控制
*/
@Slf4j
public class KickoutSessionControlFilter extends AccessControlFilter {
/**
* 踢出后到的地址
*/
private String kickoutUrl;
/**
* 踢出之前登录的/之后登录的用户 默认踢出之前登录的用户
*/
private boolean kickoutAfter = false;
/**
* 同一个帐号最大会话数 默认1
*/
private int maxSession = 1;
private SessionManager sessionManager;
private Cache<String, Deque<Serializable>> cache;
public