新增会话管理
This commit is contained in:
parent
e468d48c2f
commit
75f65b3f9c
|
|
@ -247,6 +247,28 @@ create table sys_logininfor (
|
||||||
|
|
||||||
insert into sys_logininfor values(1, 'admin', 0 , '127.0.0.1', 'Chrome 45', 'Windows 7', '登录成功' ,'2018-01-01');
|
insert into sys_logininfor values(1, 'admin', 0 , '127.0.0.1', 'Chrome 45', 'Windows 7', '登录成功' ,'2018-01-01');
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- 10、在线用户
|
||||||
|
-- ----------------------------
|
||||||
|
drop table if exists sys_user_online;
|
||||||
|
create table sys_user_online (
|
||||||
|
sessionId varchar(100) default '' comment '用户会话id',
|
||||||
|
user_id int(11) default 0 comment '用户ID',
|
||||||
|
login_name varchar(50) default '' comment '登录名',
|
||||||
|
ipaddr varchar(50) default '' comment '登录IP地址',
|
||||||
|
browser varchar(50) default '' comment '浏览器类型',
|
||||||
|
os varchar(50) default '' comment '操作系统',
|
||||||
|
status varchar(10) default '' comment '在线状态',
|
||||||
|
start_timestsamp timestamp default current_timestamp comment 'session创建时间',
|
||||||
|
last_access_time timestamp default current_timestamp comment 'session最后访问时间',
|
||||||
|
timeout int(5) default 0 comment '超时时间',
|
||||||
|
onlineSession varchar(50) default '' comment '备份的当前用户会话',
|
||||||
|
primary key (sessionId)
|
||||||
|
) engine=innodb default charset=utf8;
|
||||||
|
|
||||||
|
insert into sys_user_online(sessionId, user_id, login_name, ipaddr, browser, os, status)
|
||||||
|
values('c3b252c3-2229-4be4-a5f7-7aba4b0c314c', 1, 'admin', '127.0.0.1', 'Chrome 45', 'Windows 7', 'on_line');
|
||||||
|
|
||||||
-- 用户部门表
|
-- 用户部门表
|
||||||
SELECT * FROM sys_dept;
|
SELECT * FROM sys_dept;
|
||||||
|
|
||||||
|
|
@ -273,3 +295,6 @@ SELECT * FROM sys_code;
|
||||||
|
|
||||||
-- 系统访问日志情况信息
|
-- 系统访问日志情况信息
|
||||||
SELECT * FROM sys_logininfor;
|
SELECT * FROM sys_logininfor;
|
||||||
|
|
||||||
|
-- 在线用户信息
|
||||||
|
SELECT * FROM sys_user_online;
|
||||||
|
|
@ -1,22 +1,27 @@
|
||||||
package com.ruoyi.framework.config;
|
package com.ruoyi.framework.config;
|
||||||
|
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
|
|
||||||
import org.apache.shiro.cache.ehcache.EhCacheManager;
|
import org.apache.shiro.cache.ehcache.EhCacheManager;
|
||||||
import org.apache.shiro.mgt.SecurityManager;
|
import org.apache.shiro.mgt.SecurityManager;
|
||||||
import org.apache.shiro.session.mgt.eis.MemorySessionDAO;
|
import org.apache.shiro.session.mgt.SessionFactory;
|
||||||
import org.apache.shiro.session.mgt.eis.SessionDAO;
|
|
||||||
import org.apache.shiro.spring.LifecycleBeanPostProcessor;
|
import org.apache.shiro.spring.LifecycleBeanPostProcessor;
|
||||||
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
|
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
|
||||||
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
|
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
|
||||||
import org.apache.shiro.web.filter.authc.LogoutFilter;
|
import org.apache.shiro.web.filter.authc.LogoutFilter;
|
||||||
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
|
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
|
||||||
|
import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
|
||||||
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
|
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
|
||||||
import org.springframework.beans.factory.annotation.Qualifier;
|
import org.springframework.beans.factory.annotation.Qualifier;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
import com.ruoyi.common.utils.spring.SpringUtils;
|
import com.ruoyi.common.utils.spring.SpringUtils;
|
||||||
import com.ruoyi.project.shiro.realm.UserRealm;
|
import com.ruoyi.project.shiro.realm.UserRealm;
|
||||||
|
import com.ruoyi.project.shiro.session.OnlineSessionDAO;
|
||||||
|
import com.ruoyi.project.shiro.session.OnlineSessionFactory;
|
||||||
import com.ruoyi.project.system.menu.service.MenuServiceImpl;
|
import com.ruoyi.project.system.menu.service.MenuServiceImpl;
|
||||||
|
|
||||||
import at.pollux.thymeleaf.shiro.dialect.ShiroDialect;
|
import at.pollux.thymeleaf.shiro.dialect.ShiroDialect;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -51,14 +56,40 @@ public class ShiroConfig
|
||||||
return userRealm;
|
return userRealm;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自定义sessionDAO会话
|
||||||
|
*/
|
||||||
|
@Bean
|
||||||
|
OnlineSessionDAO sessionDAO()
|
||||||
|
{
|
||||||
|
OnlineSessionDAO sessionDAO = new OnlineSessionDAO();
|
||||||
|
return sessionDAO;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自定义sessionFactory会话
|
||||||
|
*/
|
||||||
|
@Bean
|
||||||
|
SessionFactory sessionFactory()
|
||||||
|
{
|
||||||
|
OnlineSessionFactory sessionFactory = new OnlineSessionFactory();
|
||||||
|
return sessionFactory;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 会话管理器
|
* 会话管理器
|
||||||
*/
|
*/
|
||||||
@Bean
|
@Bean
|
||||||
SessionDAO sessionDAO()
|
public DefaultWebSessionManager configWebSessionManager()
|
||||||
{
|
{
|
||||||
MemorySessionDAO sessionDAO = new MemorySessionDAO();
|
DefaultWebSessionManager manager = new DefaultWebSessionManager();
|
||||||
return sessionDAO;
|
manager.setCacheManager(getEhCacheManager());// 加入缓存管理器
|
||||||
|
manager.setSessionDAO(sessionDAO());// 设置SessionDao
|
||||||
|
manager.setDeleteInvalidSessions(true);// 删除过期的session
|
||||||
|
manager.setGlobalSessionTimeout(sessionDAO().getExpireTime());// 设置全局session超时时间
|
||||||
|
manager.setSessionValidationSchedulerEnabled(true);// 是否定时检查session
|
||||||
|
manager.setSessionFactory(sessionFactory());
|
||||||
|
return manager;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -67,10 +98,14 @@ public class ShiroConfig
|
||||||
@Bean
|
@Bean
|
||||||
SecurityManager securityManager(UserRealm userRealm)
|
SecurityManager securityManager(UserRealm userRealm)
|
||||||
{
|
{
|
||||||
DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
|
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
|
||||||
manager.setRealm(userRealm);
|
// 设置realm.
|
||||||
manager.setCacheManager(getEhCacheManager());
|
securityManager.setRealm(userRealm);
|
||||||
return manager;
|
// 注入缓存管理器;
|
||||||
|
securityManager.setCacheManager(getEhCacheManager());
|
||||||
|
// session管理器
|
||||||
|
securityManager.setSessionManager(configWebSessionManager());
|
||||||
|
return securityManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -41,4 +41,14 @@ public interface ShiroConstants
|
||||||
* 编码格式
|
* 编码格式
|
||||||
*/
|
*/
|
||||||
public static String ENCODING = "UTF-8";
|
public static String ENCODING = "UTF-8";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当前在线会话
|
||||||
|
*/
|
||||||
|
public String ONLINE_SESSION = "online_session";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 仅清空本地缓存 不情况数据库的
|
||||||
|
*/
|
||||||
|
public String ONLY_CLEAR_CACHE = "online_session_only_clear_cache";
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,7 @@ public class LoginService
|
||||||
}
|
}
|
||||||
|
|
||||||
// 查询用户信息
|
// 查询用户信息
|
||||||
User user = userService.findByUserName(username);
|
User user = userService.selectByUserName(username);
|
||||||
|
|
||||||
if (user == null)
|
if (user == null)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,194 @@
|
||||||
|
package com.ruoyi.project.shiro.session;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
|
import org.apache.commons.lang.StringUtils;
|
||||||
|
import org.apache.shiro.session.Session;
|
||||||
|
import org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import com.ruoyi.project.system.online.domain.OnlineSession;
|
||||||
|
import com.ruoyi.project.system.online.domain.UserOnline;
|
||||||
|
import com.ruoyi.project.system.online.service.IUserOnlineService;
|
||||||
|
import com.ruoyi.project.util.HttpContextUtils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 针对自定义的ShiroSession的db操作
|
||||||
|
*/
|
||||||
|
public class OnlineSessionDAO extends EnterpriseCacheSessionDAO
|
||||||
|
{
|
||||||
|
// Session超时时间,单位为毫秒
|
||||||
|
private long expireTime = 120000;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 同步session到数据库的周期 单位为毫秒(默认5分钟)
|
||||||
|
*/
|
||||||
|
private long dbSyncPeriod = 5 * 60 * 1000;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 上次同步数据库的时间戳
|
||||||
|
*/
|
||||||
|
private static final String LAST_SYNC_DB_TIMESTAMP = OnlineSessionDAO.class.getName() + "LAST_SYNC_DB_TIMESTAMP";
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IUserOnlineService onlineService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private OnlineSessionFactory onlineSessionFactory;
|
||||||
|
|
||||||
|
public OnlineSessionDAO()
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public OnlineSessionDAO(long expireTime)
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
this.expireTime = expireTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据会话ID获取会话
|
||||||
|
*
|
||||||
|
* @param sessionId 会话ID
|
||||||
|
* @return ShiroSession
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected Session doReadSession(Serializable sessionId)
|
||||||
|
{
|
||||||
|
HttpServletRequest request = HttpContextUtils.getHttpServletRequest();
|
||||||
|
String uri = request.getServletPath();
|
||||||
|
// 如果是静态文件,则不更新SESSION
|
||||||
|
if (checkStaticLink(uri))
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
System.out.println("==============doReadSession url=================" + uri);
|
||||||
|
UserOnline userOnline = onlineService.selectByOnlineId(String.valueOf(sessionId));
|
||||||
|
if (userOnline == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return onlineSessionFactory.createSession(userOnline);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新会话;如更新会话最后访问时间/停止会话/设置超时时间/设置移除属性等会调用
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected void doUpdate(Session session)
|
||||||
|
{
|
||||||
|
HttpServletRequest request = HttpContextUtils.getHttpServletRequest();
|
||||||
|
String uri = request.getServletPath();
|
||||||
|
// 如果是静态文件,则不更新SESSION
|
||||||
|
if (checkStaticLink(uri))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
System.out.println("==============update url=================" + uri);
|
||||||
|
if (session == null || session.getId() == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Session session1 = doReadSession(session.getId());
|
||||||
|
OnlineSession onlineSession = (OnlineSession) session1;
|
||||||
|
|
||||||
|
Date lastSyncTimestamp = (Date) session.getAttribute(LAST_SYNC_DB_TIMESTAMP);
|
||||||
|
if (lastSyncTimestamp != null)
|
||||||
|
{
|
||||||
|
boolean needSync = true;
|
||||||
|
long deltaTime = session.getLastAccessTime().getTime() - lastSyncTimestamp.getTime();
|
||||||
|
if (deltaTime < dbSyncPeriod)
|
||||||
|
{ // 时间差不足 无需同步
|
||||||
|
needSync = false;
|
||||||
|
}
|
||||||
|
boolean isGuest = session.getId() == null;
|
||||||
|
|
||||||
|
// 如果不是游客 且session 数据变更了 同步
|
||||||
|
if (isGuest == false && onlineSession.isAttributeChanged())
|
||||||
|
{
|
||||||
|
needSync = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (needSync == false)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
session.setAttribute(LAST_SYNC_DB_TIMESTAMP, session.getLastAccessTime());
|
||||||
|
// session.setTimeout(expireTime);
|
||||||
|
// 更新完后 重置标识
|
||||||
|
if (onlineSession.isAttributeChanged())
|
||||||
|
{
|
||||||
|
onlineSession.resetAttributeChanged();
|
||||||
|
}
|
||||||
|
onlineService.saveByOnline(UserOnline.fromOnlineSession(onlineSession));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当会话过期/停止(如用户退出时)属性等会调用
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected void doDelete(Session session)
|
||||||
|
{
|
||||||
|
System.out.println("===============delete================");
|
||||||
|
if (null == session)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
String sessionId = String.valueOf(session.getId());
|
||||||
|
onlineService.deleteByOnlineId(sessionId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取当前所有活跃用户
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Collection<Session> getActiveSessions()
|
||||||
|
{
|
||||||
|
System.out.println("==============getActiveSessions=================");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getExpireTime()
|
||||||
|
{
|
||||||
|
return expireTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setExpireTime(long expireTime)
|
||||||
|
{
|
||||||
|
this.expireTime = expireTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查是否为静态链接
|
||||||
|
*
|
||||||
|
* @return true 是 false 否
|
||||||
|
*/
|
||||||
|
public boolean checkStaticLink(String uri)
|
||||||
|
{
|
||||||
|
boolean linkFlag = false;
|
||||||
|
// 如果是登录请求,则不更新SESSION
|
||||||
|
if (StringUtils.endsWithAny(uri, new String[] { "/login", "/", "/favicon.ico" }))
|
||||||
|
{
|
||||||
|
linkFlag = true;
|
||||||
|
}
|
||||||
|
// 如果是静态文件,则不更新SESSION
|
||||||
|
if (StringUtils.startsWith(uri, "/css") && StringUtils.endsWith(uri, ".css")
|
||||||
|
|| StringUtils.startsWith(uri, "/js") && StringUtils.endsWith(uri, ".js")
|
||||||
|
|| StringUtils.startsWith(uri, "/img") && StringUtils.endsWith(uri, ".jpg")
|
||||||
|
|| StringUtils.startsWith(uri, "/img") && StringUtils.endsWith(uri, ".png")
|
||||||
|
|| StringUtils.startsWith(uri, "/fonts") && StringUtils.endsWith(uri, ".woff2")
|
||||||
|
|| StringUtils.startsWith(uri, "/js") && StringUtils.endsWith(uri, ".css")
|
||||||
|
|| StringUtils.startsWith(uri, "/css") && StringUtils.endsWith(uri, ".png")
|
||||||
|
|| StringUtils.startsWith(uri, "/css") && StringUtils.endsWith(uri, ".woff2"))
|
||||||
|
{
|
||||||
|
linkFlag = true;
|
||||||
|
}
|
||||||
|
return linkFlag;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,40 @@
|
||||||
|
package com.ruoyi.project.shiro.session;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
|
import org.apache.shiro.session.Session;
|
||||||
|
import org.apache.shiro.session.mgt.SessionContext;
|
||||||
|
import org.apache.shiro.session.mgt.SessionFactory;
|
||||||
|
import org.apache.shiro.web.session.mgt.WebSessionContext;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import com.ruoyi.project.shiro.common.utils.IpUtils;
|
||||||
|
import com.ruoyi.project.system.online.domain.OnlineSession;
|
||||||
|
import com.ruoyi.project.system.online.domain.UserOnline;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class OnlineSessionFactory implements SessionFactory
|
||||||
|
{
|
||||||
|
public Session createSession(UserOnline userOnline)
|
||||||
|
{
|
||||||
|
return userOnline.getSession();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Session createSession(SessionContext initData)
|
||||||
|
{
|
||||||
|
OnlineSession session = new OnlineSession();
|
||||||
|
if (initData != null && initData instanceof WebSessionContext)
|
||||||
|
{
|
||||||
|
WebSessionContext sessionContext = (WebSessionContext) initData;
|
||||||
|
HttpServletRequest request = (HttpServletRequest) sessionContext.getServletRequest();
|
||||||
|
if (request != null)
|
||||||
|
{
|
||||||
|
session.setHost(IpUtils.getIpAddr(request));
|
||||||
|
session.setBrowser(request.getHeader("User-Agent"));
|
||||||
|
session.setHost(request.getLocalAddr() + ":" + request.getLocalPort());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return session;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,29 @@
|
||||||
|
package com.ruoyi.project.system.online.dao;
|
||||||
|
|
||||||
|
import com.ruoyi.project.system.online.domain.UserOnline;
|
||||||
|
|
||||||
|
public interface IUserOnlineDao
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* 通过会话序号查询信息
|
||||||
|
*
|
||||||
|
* @param sessionId 会话ID
|
||||||
|
* @return 在线用户信息
|
||||||
|
*/
|
||||||
|
public UserOnline selectByOnlineId(String sessionId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通过会话序号删除信息
|
||||||
|
*
|
||||||
|
* @param sessionId 会话ID
|
||||||
|
* @return 在线用户信息
|
||||||
|
*/
|
||||||
|
public int deleteByOnlineId(String sessionId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 保存会话信息
|
||||||
|
*
|
||||||
|
* @param online 会话信息
|
||||||
|
*/
|
||||||
|
public int saveByOnline(UserOnline online);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,42 @@
|
||||||
|
package com.ruoyi.project.system.online.dao;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Repository;
|
||||||
|
import com.ruoyi.framework.core.dao.DynamicObjectBaseDao;
|
||||||
|
import com.ruoyi.project.system.online.domain.UserOnline;
|
||||||
|
|
||||||
|
@Repository("userOnlineDao")
|
||||||
|
public class UserOnlineDaoImpl extends DynamicObjectBaseDao implements IUserOnlineDao
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* 通过会话序号查询信息
|
||||||
|
*
|
||||||
|
* @param sessionId 会话ID
|
||||||
|
* @return 在线用户信息
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public UserOnline selectByOnlineId(String sessionId)
|
||||||
|
{
|
||||||
|
return this.findForObject("SystemOnlineMapper.selectByOnlineId", sessionId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通过会话序号删除信息
|
||||||
|
*
|
||||||
|
* @param sessionId 会话ID
|
||||||
|
* @return 在线用户信息
|
||||||
|
*/
|
||||||
|
public int deleteByOnlineId(String sessionId)
|
||||||
|
{
|
||||||
|
return this.delete("SystemOnlineMapper.deleteByOnlineId", sessionId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 保存会话信息
|
||||||
|
*
|
||||||
|
* @param online 会话信息
|
||||||
|
*/
|
||||||
|
public int saveByOnline(UserOnline online)
|
||||||
|
{
|
||||||
|
return this.save("SystemOnlineMapper.saveByOnline", online);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,280 @@
|
||||||
|
package com.ruoyi.project.system.online.domain;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.ObjectInputStream;
|
||||||
|
import java.io.ObjectOutputStream;
|
||||||
|
import org.apache.shiro.session.mgt.SimpleSession;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class OnlineSession extends SimpleSession
|
||||||
|
{
|
||||||
|
|
||||||
|
// Serialization reminder:
|
||||||
|
// You _MUST_ change this number if you introduce a change to this class
|
||||||
|
// that is NOT serialization backwards compatible. Serialization-compatible
|
||||||
|
// changes do not require a change to this number. If you need to generate
|
||||||
|
// a new number in this case, use the JDK's 'serialver' program to generate
|
||||||
|
// it.
|
||||||
|
private static final long serialVersionUID = -7125642695178165650L;
|
||||||
|
static int bitIndexCounter = 0;
|
||||||
|
private static final int USER_ID_BIT_MASK = 1 << bitIndexCounter++;
|
||||||
|
private static final int USER_AGENT_BIT_MASK = 1 << bitIndexCounter++;
|
||||||
|
private static final int STATUS_BIT_MASK = 1 << bitIndexCounter++;
|
||||||
|
private static final int USERNAME_BIT_MASK = 1 << bitIndexCounter++;
|
||||||
|
// private static final int REMEMBER_ME_BIT_MASK = 1 << bitIndexCounter++;
|
||||||
|
|
||||||
|
public static enum OnlineStatus
|
||||||
|
{
|
||||||
|
on_line("在线"), hidden("隐身"), force_logout("强制退出");
|
||||||
|
private final String info;
|
||||||
|
|
||||||
|
private OnlineStatus(String info)
|
||||||
|
{
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getInfo()
|
||||||
|
{
|
||||||
|
return info;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
return super.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// sessionId
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
// 当前登录的用户Id
|
||||||
|
private String userId;
|
||||||
|
|
||||||
|
// 登录名
|
||||||
|
private String loginName;
|
||||||
|
|
||||||
|
// 登录IP地址
|
||||||
|
private String host;
|
||||||
|
|
||||||
|
// 浏览器类型
|
||||||
|
private String browser;
|
||||||
|
|
||||||
|
// 操作系统
|
||||||
|
private String os;
|
||||||
|
|
||||||
|
// 在线状态
|
||||||
|
private OnlineStatus status = OnlineStatus.on_line;
|
||||||
|
|
||||||
|
public OnlineSession()
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public OnlineSession(String host)
|
||||||
|
{
|
||||||
|
super(host);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getId()
|
||||||
|
{
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(String id)
|
||||||
|
{
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUserId()
|
||||||
|
{
|
||||||
|
return userId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUserId(String userId)
|
||||||
|
{
|
||||||
|
this.userId = userId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLoginName()
|
||||||
|
{
|
||||||
|
return loginName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLoginName(String loginName)
|
||||||
|
{
|
||||||
|
this.loginName = loginName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getHost()
|
||||||
|
{
|
||||||
|
return host;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHost(String host)
|
||||||
|
{
|
||||||
|
this.host = host;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getBrowser()
|
||||||
|
{
|
||||||
|
return browser;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBrowser(String browser)
|
||||||
|
{
|
||||||
|
this.browser = browser;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getOs()
|
||||||
|
{
|
||||||
|
return os;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOs(String os)
|
||||||
|
{
|
||||||
|
this.os = os;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OnlineStatus getStatus()
|
||||||
|
{
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStatus(OnlineStatus status)
|
||||||
|
{
|
||||||
|
this.status = status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 属性是否改变 优化session数据同步
|
||||||
|
*/
|
||||||
|
private transient boolean attributeChanged = false;
|
||||||
|
|
||||||
|
public void markAttributeChanged()
|
||||||
|
{
|
||||||
|
this.attributeChanged = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void resetAttributeChanged()
|
||||||
|
{
|
||||||
|
this.attributeChanged = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isAttributeChanged()
|
||||||
|
{
|
||||||
|
return attributeChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setAttribute(Object key, Object value)
|
||||||
|
{
|
||||||
|
super.setAttribute(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object removeAttribute(Object key)
|
||||||
|
{
|
||||||
|
return super.removeAttribute(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Serializes this object to the specified output stream for JDK Serialization.
|
||||||
|
*
|
||||||
|
* @param out output stream used for Object serialization.
|
||||||
|
* @throws java.io.IOException if any of this object's fields cannot be written to the stream.
|
||||||
|
* @since 1.0
|
||||||
|
*/
|
||||||
|
private void writeObject(ObjectOutputStream out) throws IOException
|
||||||
|
{
|
||||||
|
out.defaultWriteObject();
|
||||||
|
short alteredFieldsBitMask = getAlteredFieldsBitMask();
|
||||||
|
out.writeShort(alteredFieldsBitMask);
|
||||||
|
if (userId != null)
|
||||||
|
{
|
||||||
|
out.writeObject(userId);
|
||||||
|
}
|
||||||
|
if (browser != null)
|
||||||
|
{
|
||||||
|
out.writeObject(browser);
|
||||||
|
}
|
||||||
|
if (status != null)
|
||||||
|
{
|
||||||
|
out.writeObject(status);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (loginName != null)
|
||||||
|
{
|
||||||
|
out.writeObject(loginName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reconstitutes this object based on the specified InputStream for JDK Serialization.
|
||||||
|
*
|
||||||
|
* @param in the input stream to use for reading data to populate this object.
|
||||||
|
* @throws IOException if the input stream cannot be used.
|
||||||
|
* @throws ClassNotFoundException if a required class needed for instantiation is not available in the present JVM
|
||||||
|
* @since 1.0
|
||||||
|
*/
|
||||||
|
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
|
||||||
|
{
|
||||||
|
in.defaultReadObject();
|
||||||
|
short bitMask = in.readShort();
|
||||||
|
|
||||||
|
if (isFieldPresent(bitMask, USER_ID_BIT_MASK))
|
||||||
|
{
|
||||||
|
this.userId = (String) in.readObject();
|
||||||
|
}
|
||||||
|
if (isFieldPresent(bitMask, USER_AGENT_BIT_MASK))
|
||||||
|
{
|
||||||
|
this.browser = (String) in.readObject();
|
||||||
|
}
|
||||||
|
if (isFieldPresent(bitMask, STATUS_BIT_MASK))
|
||||||
|
{
|
||||||
|
this.status = (OnlineStatus) in.readObject();
|
||||||
|
}
|
||||||
|
if (isFieldPresent(bitMask, USERNAME_BIT_MASK))
|
||||||
|
{
|
||||||
|
this.loginName = (String) in.readObject();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a bit mask used during serialization indicating which fields have been serialized. Fields that have been
|
||||||
|
* altered (not null and/or not retaining the class defaults) will be serialized and have 1 in their respective
|
||||||
|
* index, fields that are null and/or retain class default values have 0.
|
||||||
|
*
|
||||||
|
* @return a bit mask used during serialization indicating which fields have been serialized.
|
||||||
|
* @since 1.0
|
||||||
|
*/
|
||||||
|
private short getAlteredFieldsBitMask()
|
||||||
|
{
|
||||||
|
int bitMask = 0;
|
||||||
|
bitMask = userId != null ? bitMask | USER_ID_BIT_MASK : bitMask;
|
||||||
|
bitMask = browser != null ? bitMask | USER_AGENT_BIT_MASK : bitMask;
|
||||||
|
bitMask = status != null ? bitMask | STATUS_BIT_MASK : bitMask;
|
||||||
|
bitMask = loginName != null ? bitMask | USERNAME_BIT_MASK : bitMask;
|
||||||
|
return (short) bitMask;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns {@code true} if the given {@code bitMask} argument indicates that the specified field has been serialized
|
||||||
|
* and therefore should be read during deserialization, {@code false} otherwise.
|
||||||
|
*
|
||||||
|
* @param bitMask the aggregate bitmask for all fields that have been serialized. Individual bits represent the
|
||||||
|
* fields that have been serialized. A bit set to 1 means that corresponding field has been serialized, 0
|
||||||
|
* means it hasn't been serialized.
|
||||||
|
* @param fieldBitMask the field bit mask constant identifying which bit to inspect (corresponds to a class
|
||||||
|
* attribute).
|
||||||
|
* @return {@code true} if the given {@code bitMask} argument indicates that the specified field has been serialized
|
||||||
|
* and therefore should be read during deserialization, {@code false} otherwise.
|
||||||
|
* @since 1.0
|
||||||
|
*/
|
||||||
|
private static boolean isFieldPresent(short bitMask, int fieldBitMask)
|
||||||
|
{
|
||||||
|
return (bitMask & fieldBitMask) != 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,175 @@
|
||||||
|
package com.ruoyi.project.system.online.domain;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当前在线会话 sys_user_online
|
||||||
|
*
|
||||||
|
* @author yangzz
|
||||||
|
*/
|
||||||
|
public class UserOnline implements Serializable
|
||||||
|
{
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
// 用户会话id
|
||||||
|
private String sessionId;
|
||||||
|
|
||||||
|
// 当前登录的用户Id
|
||||||
|
private String userId;
|
||||||
|
|
||||||
|
// 登录名
|
||||||
|
private String loginName;
|
||||||
|
|
||||||
|
// 登录IP地址
|
||||||
|
private String host;
|
||||||
|
|
||||||
|
// 浏览器类型
|
||||||
|
private String browser;
|
||||||
|
|
||||||
|
// 操作系统
|
||||||
|
private String os;
|
||||||
|
|
||||||
|
// 在线状态
|
||||||
|
private OnlineSession.OnlineStatus status = OnlineSession.OnlineStatus.on_line;
|
||||||
|
|
||||||
|
// 在线状态
|
||||||
|
private Date startTimestamp;
|
||||||
|
|
||||||
|
// session最后访问时间
|
||||||
|
private Date lastAccessTime;
|
||||||
|
|
||||||
|
// 超时时间
|
||||||
|
private Long timeout;
|
||||||
|
|
||||||
|
// 备份的当前用户会话
|
||||||
|
private OnlineSession session;
|
||||||
|
|
||||||
|
public String getSessionId()
|
||||||
|
{
|
||||||
|
return sessionId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSessionId(String sessionId)
|
||||||
|
{
|
||||||
|
this.sessionId = sessionId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUserId()
|
||||||
|
{
|
||||||
|
return userId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUserId(String userId)
|
||||||
|
{
|
||||||
|
this.userId = userId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLoginName()
|
||||||
|
{
|
||||||
|
return loginName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLoginName(String loginName)
|
||||||
|
{
|
||||||
|
this.loginName = loginName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getHost()
|
||||||
|
{
|
||||||
|
return host;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHost(String host)
|
||||||
|
{
|
||||||
|
this.host = host;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getBrowser()
|
||||||
|
{
|
||||||
|
return browser;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBrowser(String browser)
|
||||||
|
{
|
||||||
|
this.browser = browser;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getOs()
|
||||||
|
{
|
||||||
|
return os;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOs(String os)
|
||||||
|
{
|
||||||
|
this.os = os;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OnlineSession.OnlineStatus getStatus()
|
||||||
|
{
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStatus(OnlineSession.OnlineStatus status)
|
||||||
|
{
|
||||||
|
this.status = status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getStartTimestamp()
|
||||||
|
{
|
||||||
|
return startTimestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStartTimestamp(Date startTimestamp)
|
||||||
|
{
|
||||||
|
this.startTimestamp = startTimestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getLastAccessTime()
|
||||||
|
{
|
||||||
|
return lastAccessTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLastAccessTime(Date lastAccessTime)
|
||||||
|
{
|
||||||
|
this.lastAccessTime = lastAccessTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getTimeout()
|
||||||
|
{
|
||||||
|
return timeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTimeout(Long timeout)
|
||||||
|
{
|
||||||
|
this.timeout = timeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OnlineSession getSession()
|
||||||
|
{
|
||||||
|
return session;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSession(OnlineSession session)
|
||||||
|
{
|
||||||
|
this.session = session;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final UserOnline fromOnlineSession(OnlineSession session)
|
||||||
|
{
|
||||||
|
UserOnline online = new UserOnline();
|
||||||
|
online.setSessionId(String.valueOf(session.getId()));
|
||||||
|
online.setUserId(session.getUserId());
|
||||||
|
online.setLoginName(session.getLoginName());
|
||||||
|
online.setStartTimestamp(session.getStartTimestamp());
|
||||||
|
online.setLastAccessTime(session.getLastAccessTime());
|
||||||
|
online.setTimeout(session.getTimeout());
|
||||||
|
online.setHost(session.getHost());
|
||||||
|
online.setBrowser(session.getBrowser());
|
||||||
|
online.setOs(session.getOs());
|
||||||
|
online.setSession(session);
|
||||||
|
|
||||||
|
return online;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,29 @@
|
||||||
|
package com.ruoyi.project.system.online.service;
|
||||||
|
|
||||||
|
import com.ruoyi.project.system.online.domain.UserOnline;
|
||||||
|
|
||||||
|
public interface IUserOnlineService
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* 通过会话序号查询信息
|
||||||
|
*
|
||||||
|
* @param sessionId 会话ID
|
||||||
|
* @return 在线用户信息
|
||||||
|
*/
|
||||||
|
public UserOnline selectByOnlineId(String sessionId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通过会话序号删除信息
|
||||||
|
*
|
||||||
|
* @param sessionId 会话ID
|
||||||
|
* @return 在线用户信息
|
||||||
|
*/
|
||||||
|
public void deleteByOnlineId(String sessionId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 保存会话信息
|
||||||
|
*
|
||||||
|
* @param online 会话信息
|
||||||
|
*/
|
||||||
|
public void saveByOnline(UserOnline online);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,49 @@
|
||||||
|
package com.ruoyi.project.system.online.service;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import com.ruoyi.project.system.online.dao.IUserOnlineDao;
|
||||||
|
import com.ruoyi.project.system.online.domain.UserOnline;
|
||||||
|
|
||||||
|
@Service("userOnlineService")
|
||||||
|
public class UserOnlineServiceImpl implements IUserOnlineService
|
||||||
|
{
|
||||||
|
@Autowired
|
||||||
|
private IUserOnlineDao userOnlineDao;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通过会话序号查询信息
|
||||||
|
*
|
||||||
|
* @param sessionId 会话ID
|
||||||
|
* @return 在线用户信息
|
||||||
|
*/
|
||||||
|
public UserOnline selectByOnlineId(String sessionId)
|
||||||
|
{
|
||||||
|
return userOnlineDao.selectByOnlineId(sessionId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通过会话序号删除信息
|
||||||
|
*
|
||||||
|
* @param sessionId 会话ID
|
||||||
|
* @return 在线用户信息
|
||||||
|
*/
|
||||||
|
public void deleteByOnlineId(String sessionId)
|
||||||
|
{
|
||||||
|
UserOnline userOnline = selectByOnlineId(sessionId);
|
||||||
|
if (userOnline != null)
|
||||||
|
{
|
||||||
|
userOnlineDao.deleteByOnlineId(sessionId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 保存会话信息
|
||||||
|
*
|
||||||
|
* @param online 会话信息
|
||||||
|
*/
|
||||||
|
public void saveByOnline(UserOnline online)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -26,6 +26,6 @@ public interface IUserDao
|
||||||
* @param userName 用户名
|
* @param userName 用户名
|
||||||
* @return 用户对象信息
|
* @return 用户对象信息
|
||||||
*/
|
*/
|
||||||
public User findByUserName(String userName);
|
public User selectByUserName(String userName);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -45,9 +45,9 @@ public class UserDaoImpl extends DynamicObjectBaseDao implements IUserDao
|
||||||
* @return 用户对象信息
|
* @return 用户对象信息
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public User findByUserName(String username)
|
public User selectByUserName(String username)
|
||||||
{
|
{
|
||||||
return this.findForObject("SystemUserMapper.findByUserName", username);
|
return this.findForObject("SystemUserMapper.selectByUserName", username);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -26,5 +26,5 @@ public interface IUserService
|
||||||
* @param userName 用户名
|
* @param userName 用户名
|
||||||
* @return 用户对象信息
|
* @return 用户对象信息
|
||||||
*/
|
*/
|
||||||
public User findByUserName(String userName);
|
public User selectByUserName(String userName);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -39,9 +39,9 @@ public class UserServiceImpl implements IUserService
|
||||||
* @return 用户对象信息
|
* @return 用户对象信息
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public User findByUserName(String userName)
|
public User selectByUserName(String userName)
|
||||||
{
|
{
|
||||||
return userDao.findByUserName(userName);
|
return userDao.selectByUserName(userName);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,46 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<!DOCTYPE mapper
|
||||||
|
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||||
|
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
|
<mapper namespace="SystemOnlineMapper">
|
||||||
|
|
||||||
|
<resultMap type="UserOnline" id="UserOnlineResult">
|
||||||
|
<id property="sessionId" column="sessionId" />
|
||||||
|
<result property="userId" column="user_id" />
|
||||||
|
<result property="loginName" column="login_name" />
|
||||||
|
<result property="host" column="ipaddr" />
|
||||||
|
<result property="browser" column="browser" />
|
||||||
|
<result property="os" column="os" />
|
||||||
|
<result property="status" column="status" />
|
||||||
|
<result property="startTimestamp" column="start_timestsamp" />
|
||||||
|
<result property="lastAccessTime" column="last_access_time" />
|
||||||
|
<result property="timeout" column="timeout" />
|
||||||
|
<association property="session" javaType="OnlineSession" resultMap="OnlineSessionResult" />
|
||||||
|
</resultMap>
|
||||||
|
|
||||||
|
<resultMap type="OnlineSession" id="OnlineSessionResult">
|
||||||
|
<id property="id" column="sessionId" />
|
||||||
|
<result property="userId" column="user_id" />
|
||||||
|
<result property="loginName" column="login_name" />
|
||||||
|
<result property="host" column="ipaddr" />
|
||||||
|
<result property="browser" column="browser" />
|
||||||
|
<result property="os" column="os" />
|
||||||
|
<result property="status" column="status" />
|
||||||
|
</resultMap>
|
||||||
|
|
||||||
|
<select id="selectByOnlineId" parameterType="String" resultMap="UserOnlineResult">
|
||||||
|
SELECT *
|
||||||
|
FROM sys_user_online
|
||||||
|
WHERE sessionId = #{sessionId}
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<insert id="insertLogininfor" parameterType="UserOnline">
|
||||||
|
replace into sys_user_online(sessionId, user_id, login_name, ipaddr, browser, os, STATUS)
|
||||||
|
values (#{sessionId}, #{user_id}, #{login_name}, #{host}, #{browser}, #{os}, #{STATUS})
|
||||||
|
</insert>
|
||||||
|
|
||||||
|
<delete id="deleteByOnlineId" parameterType="String">
|
||||||
|
delete from sys_user_online where sessionId = #{sessionId}
|
||||||
|
</delete>
|
||||||
|
|
||||||
|
</mapper>
|
||||||
|
|
@ -44,7 +44,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||||
select * from sys_user
|
select * from sys_user
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<select id="findByUserName" parameterType="String" resultMap="UserResult">
|
<select id="selectByUserName" parameterType="String" resultMap="UserResult">
|
||||||
SELECT u.user_id, u.dept_id, u.login_name, u.user_name, u.email, u.phonenumber, u.password, u.salt, u.status, u.refuse_des, u.create_time,
|
SELECT u.user_id, u.dept_id, u.login_name, u.user_name, u.email, u.phonenumber, u.password, u.salt, u.status, u.refuse_des, u.create_time,
|
||||||
d.dept_id, d.parent_id, d.dept_name, d.order_num, d.status as dept_status,
|
d.dept_id, d.parent_id, d.dept_name, d.order_num, d.status as dept_status,
|
||||||
r.role_id, r.role_name, r.status as role_status, r.remark
|
r.role_id, r.role_name, r.status as role_status, r.remark
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue