From e8ed66af80b406014977d8bdd2b1d1cb0f66ed4f Mon Sep 17 00:00:00 2001 From: shuzheng <469741414@qq.com> Date: Mon, 27 Feb 2017 22:35:21 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E5=86=99session=E5=92=8Csession?= =?UTF-8?q?=E5=B7=A5=E5=8E=82=EF=BC=8C=E5=A2=9E=E5=8A=A0session=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../zheng/upms/server/shiro/UpmsSession.java | 57 +++++++++++++++++++ ...ssionRedisDao.java => UpmsSessionDao.java} | 44 ++++++++++---- .../upms/server/shiro/UpmsSessionFactory.java | 56 ++++++++++++++++++ ...Listener.java => UpmsSessionListener.java} | 7 +-- .../resources/applicationContext-shiro.xml | 8 ++- 5 files changed, 156 insertions(+), 16 deletions(-) create mode 100644 zheng-upms/zheng-upms-server/src/main/java/com/zheng/upms/server/shiro/UpmsSession.java rename zheng-upms/zheng-upms-server/src/main/java/com/zheng/upms/server/shiro/{SessionRedisDao.java => UpmsSessionDao.java} (70%) create mode 100644 zheng-upms/zheng-upms-server/src/main/java/com/zheng/upms/server/shiro/UpmsSessionFactory.java rename zheng-upms/zheng-upms-server/src/main/java/com/zheng/upms/server/shiro/{listener/ShiroSessionListener.java => UpmsSessionListener.java} (67%) diff --git a/zheng-upms/zheng-upms-server/src/main/java/com/zheng/upms/server/shiro/UpmsSession.java b/zheng-upms/zheng-upms-server/src/main/java/com/zheng/upms/server/shiro/UpmsSession.java new file mode 100644 index 00000000..89ad4ce0 --- /dev/null +++ b/zheng-upms/zheng-upms-server/src/main/java/com/zheng/upms/server/shiro/UpmsSession.java @@ -0,0 +1,57 @@ +package com.zheng.upms.server.shiro; + +import org.apache.shiro.session.mgt.SimpleSession; + +/** + * 重写session + * Created by shuzheng on 2017/2/27. + */ +public class UpmsSession extends SimpleSession { + + 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; + } + } + + // 用户浏览器类型 + private String userAgent; + + // 在线状态 + private OnlineStatus status = OnlineStatus.on_line; + + // 用户登录时系统IP + private String systemHost; + + public String getUserAgent() { + return userAgent; + } + + public void setUserAgent(String userAgent) { + this.userAgent = userAgent; + } + + public OnlineStatus getStatus() { + return status; + } + + public void setStatus(OnlineStatus status) { + this.status = status; + } + + public String getSystemHost() { + return systemHost; + } + + public void setSystemHost(String systemHost) { + this.systemHost = systemHost; + } + +} diff --git a/zheng-upms/zheng-upms-server/src/main/java/com/zheng/upms/server/shiro/SessionRedisDao.java b/zheng-upms/zheng-upms-server/src/main/java/com/zheng/upms/server/shiro/UpmsSessionDao.java similarity index 70% rename from zheng-upms/zheng-upms-server/src/main/java/com/zheng/upms/server/shiro/SessionRedisDao.java rename to zheng-upms/zheng-upms-server/src/main/java/com/zheng/upms/server/shiro/UpmsSessionDao.java index bfdddbe6..528194f6 100644 --- a/zheng-upms/zheng-upms-server/src/main/java/com/zheng/upms/server/shiro/SessionRedisDao.java +++ b/zheng-upms/zheng-upms-server/src/main/java/com/zheng/upms/server/shiro/UpmsSessionDao.java @@ -1,6 +1,5 @@ package com.zheng.upms.server.shiro; -import com.zheng.common.util.CookieUtil; import com.zheng.common.util.RedisUtil; import org.apache.shiro.session.Session; import org.apache.shiro.session.mgt.SimpleSession; @@ -10,17 +9,22 @@ import org.slf4j.LoggerFactory; import redis.clients.jedis.Jedis; import java.io.*; +import java.util.List; import java.util.Set; /** * 基于redis的sessionDao,缓存共享session * Created by shuzheng on 2017/2/23. */ -public class SessionRedisDao extends EnterpriseCacheSessionDAO { +public class UpmsSessionDao extends EnterpriseCacheSessionDAO { - private static Logger _log = LoggerFactory.getLogger(SessionRedisDao.class); - // 全局会话key + private static Logger _log = LoggerFactory.getLogger(UpmsSessionDao.class); + // 全局会话cookie的key private final static String ZHENG_UPMS_SERVER_SESSION_ID = "zheng-upms-server-session-id"; + // 全局会话redis的key + private final static String ZHENG_UPMS_SHIRO_SESSION_ID = "zheng-upms-shiro-session-id"; + // 全局会话redis的id列表key + private final static String ZHENG_UPMS_SHIRO_SESSION_IDS = "zheng-upms-shiro-session-ids"; // token key private final static String ZHENG_UPMS_SERVER_TOKEN = "zheng-upms-server-token"; // 局部会话key @@ -31,8 +35,12 @@ public class SessionRedisDao extends EnterpriseCacheSessionDAO { @Override protected Serializable doCreate(Session session) { Serializable sessionId = super.doCreate(session); - RedisUtil.set(sessionToByte("shiro-sessionId-" + sessionId), sessionToByte(session)); - _log.debug("[SessionRedisDao]创建session: sessionId={}", session.getId()); + RedisUtil.set(sessionToByte(ZHENG_UPMS_SHIRO_SESSION_ID + "_" + sessionId), sessionToByte(session)); + _log.debug("[UpmsSessionDao]创建session: sessionId={}", session.getId()); + // 维护会话id列表,提供会话分页管理 + Jedis jedis = RedisUtil.getJedis(); + jedis.lpush(ZHENG_UPMS_SHIRO_SESSION_IDS, sessionId.toString()); + jedis.close(); return sessionId; } @@ -44,7 +52,7 @@ public class SessionRedisDao extends EnterpriseCacheSessionDAO { byte[] bytes = RedisUtil.get(sessionId.toString().getBytes()); if(null != bytes && bytes.length > 0){ session = (Session) byteToSession(bytes); - _log.debug("[SessionRedisDao]redis中获取session: sessionId={}", session.getId()); + _log.debug("[UpmsSessionDao]redis中获取session: sessionId={}", session.getId()); } } return session; @@ -55,7 +63,7 @@ public class SessionRedisDao extends EnterpriseCacheSessionDAO { // 更新session的最后一次访问时间 super.doUpdate(session); RedisUtil.set(session.getId().toString().getBytes(), sessionToByte(session)); - _log.debug("[SessionRedisDao]redis中更新session: sessionId={}", session.getId()); + _log.debug("[UpmsSessionDao]redis中更新session: sessionId={}", session.getId()); } @Override @@ -80,8 +88,24 @@ public class SessionRedisDao extends EnterpriseCacheSessionDAO { // 删除session super.doDelete(session); - RedisUtil.remove(session.getId().toString().getBytes()); - _log.debug("[SessionRedisDao]redis中删除session: sessionId={}", session.getId()); + RedisUtil.remove(sessionToByte(ZHENG_UPMS_SHIRO_SESSION_ID + "_" + serverSessionId)); + _log.debug("[UpmsSessionDao]redis中删除session: sessionId={}", session.getId()); + + // 维护会话id列表,提供会话分页管理 + jedis = RedisUtil.getJedis(); + jedis.lrem(ZHENG_UPMS_SHIRO_SESSION_IDS, 1, serverSessionId); + jedis.close(); + } + + /** + * 获取会话列表 + * @param page + * @param size + * @return + */ + List getActiveSessions(int page, int size) { + // TODO + return null; } // 把Object对象转化为byte保存到redis中 diff --git a/zheng-upms/zheng-upms-server/src/main/java/com/zheng/upms/server/shiro/UpmsSessionFactory.java b/zheng-upms/zheng-upms-server/src/main/java/com/zheng/upms/server/shiro/UpmsSessionFactory.java new file mode 100644 index 00000000..6262d0ad --- /dev/null +++ b/zheng-upms/zheng-upms-server/src/main/java/com/zheng/upms/server/shiro/UpmsSessionFactory.java @@ -0,0 +1,56 @@ +package com.zheng.upms.server.shiro; + +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 javax.servlet.http.HttpServletRequest; + +/** + * session工厂 + * Created by shuzheng on 2017/2/27. + */ +public class UpmsSessionFactory implements SessionFactory { + + @Override + public Session createSession(SessionContext sessionContext) { + UpmsSession session = new UpmsSession(); + if (sessionContext != null && sessionContext instanceof WebSessionContext) { + WebSessionContext webSessionContext = (WebSessionContext) sessionContext; + HttpServletRequest request = (HttpServletRequest) webSessionContext.getServletRequest(); + if (request != null) { + session.setHost(request.getRemoteAddr()); + session.setUserAgent(request.getHeader("User-Agent")); + session.setSystemHost(request.getLocalAddr() + ":" + request.getLocalPort()); + } + } + return session; + } + + /** + * 获取ip工具类,除了getRemoteAddr,其他ip均可伪造 + * @param request + * @return + */ + public String getIpAddr(HttpServletRequest request) { + String ip = request.getHeader("Cdn-Src-Ip"); // 网宿cdn的真实ip + if (ip == null || ip.length() == 0 || " unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("HTTP_CLIENT_IP"); // 蓝讯cdn的真实ip + } + if (ip == null || ip.length() == 0 || " unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("X-Forwarded-For"); // 获取代理ip + } + if (ip == null || ip.length() == 0 || " unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); // 获取代理ip + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("WL-Proxy-Client-IP"); // 获取代理ip + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); // 获取真实ip + } + return ip; + } + +} diff --git a/zheng-upms/zheng-upms-server/src/main/java/com/zheng/upms/server/shiro/listener/ShiroSessionListener.java b/zheng-upms/zheng-upms-server/src/main/java/com/zheng/upms/server/shiro/UpmsSessionListener.java similarity index 67% rename from zheng-upms/zheng-upms-server/src/main/java/com/zheng/upms/server/shiro/listener/ShiroSessionListener.java rename to zheng-upms/zheng-upms-server/src/main/java/com/zheng/upms/server/shiro/UpmsSessionListener.java index 6709d298..ada29ba1 100644 --- a/zheng-upms/zheng-upms-server/src/main/java/com/zheng/upms/server/shiro/listener/ShiroSessionListener.java +++ b/zheng-upms/zheng-upms-server/src/main/java/com/zheng/upms/server/shiro/UpmsSessionListener.java @@ -1,6 +1,5 @@ -package com.zheng.upms.server.shiro.listener; +package com.zheng.upms.server.shiro; -import com.zheng.upms.server.controller.manage.UpmsOrganizationController; import org.apache.shiro.session.Session; import org.apache.shiro.session.SessionListener; import org.slf4j.Logger; @@ -9,9 +8,9 @@ import org.slf4j.LoggerFactory; /** * Created by shuzheng on 2017/2/12. */ -public class ShiroSessionListener implements SessionListener { +public class UpmsSessionListener implements SessionListener { - private static Logger _log = LoggerFactory.getLogger(ShiroSessionListener.class); + private static Logger _log = LoggerFactory.getLogger(UpmsSessionListener.class); @Override public void onStart(Session session) { diff --git a/zheng-upms/zheng-upms-server/src/main/resources/applicationContext-shiro.xml b/zheng-upms/zheng-upms-server/src/main/resources/applicationContext-shiro.xml index f98bf86d..c6c8946e 100644 --- a/zheng-upms/zheng-upms-server/src/main/resources/applicationContext-shiro.xml +++ b/zheng-upms/zheng-upms-server/src/main/resources/applicationContext-shiro.xml @@ -58,6 +58,7 @@ + @@ -68,7 +69,7 @@ - + @@ -81,7 +82,10 @@ - + + + +