1.首先在配置文件中配置指定的参数(application.yml)
如上图所示,在session中配置maxSession 和kickoutAfter。
2.然后在com\ruoyi\framework\config\ShiroConfig.java
(1)获取配置文件中maxSession 和kickoutAfter的值。
// 同一个用户最大会话数
@Value("${shiro.session.maxSession}")
private int maxSession;
// 踢出之前登录的/之后登录的用户,默认踢出之前登录的用户
@Value("${shiro.session.kickoutAfter}")
private boolean kickoutAfter;
(2)同一个用户最大的会话数,默认-1无限制;比如2的意思是同一个用户允许最多同时两个人登录。是否踢出后来登录的,默认是false;即后者登录的用户踢出前者登录的用户;踢出顺序。被踢出后重定向到的地址;
/**
* 同一个用户多设备登录限制
*/
public KickoutSessionFilter kickoutSessionFilter()
{
KickoutSessionFilter kickoutSessionFilter = new KickoutSessionFilter();
kickoutSessionFilter.setCacheManager(getEhCacheManager());
kickoutSessionFilter.setSessionManager(sessionManager());
// 同一个用户最大的会话数,默认-1无限制;比如2的意思是同一个用户允许最多同时两个人登录
kickoutSessionFilter.setMaxSession(maxSession);
// 是否踢出后来登录的,默认是false;即后者登录的用户踢出前者登录的用户;踢出顺序
kickoutSessionFilter.setKickoutAfter(kickoutAfter);
// 被踢出后重定向到的地址;
kickoutSessionFilter.setKickoutUrl("/login?kickout=1");
return kickoutSessionFilter;
}
(3)把kickoutSessionFilter()
注入到shiroFilterFactoryBean
中。
Map<String, Filter> filters = new LinkedHashMap<String, Filter>();
//限制同一帐号同时在线的个数。
filters.put("kickout", kickoutSessionFilter());
// 注销成功,则跳转到指定页面
filters.put("logout", logoutFilter());
shiroFilterFactoryBean.setFilters(filters);