基于redis的session共享实现
来源:互联网 发布:linux查看端口监听 编辑:程序博客网 时间:2024/06/06 02:05
项目上线,闲来无事,把项目里用到的session共享贴出来,因为有多个项目要用到这个功能,所以这个部分功能独立出来了。总得来说,就是自己写了一个拦截器,在拦截器里面把session放进了redis里面,从而实现了session共享。
首先贴出web.xml的配置,和普通拦截器的配置一样:
<filter> <filter-name>sessionFilter</filter-name> <filter-class>com.dnkx.web.filter.SessionFilter</filter-class> </filter> <filter-mapping> <filter-name>sessionFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- session过期时间 --> <session-config> <session-timeout>30</session-timeout> </session-config>
然后是sessionFilter:
public class SessionFilter extends HttpServlet implements Filter { /** * */private static final long serialVersionUID = -5723213015901607291L;@Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; request.setAttribute("hostname", InetAddress.getLocalHost().getHostName()); filterChain.doFilter(new HttpServletRequestWrapper(request, response), servletResponse); }}
上面两段代码都是基础,没什么好解释的,下面贴出关键的HttpServletRequestWrapper类:
public class HttpServletRequestWrapper extends javax.servlet.http.HttpServletRequestWrapper { private static final String cookieId = "csid"; static String sessionHoldKey = "session_hold_key"; private String sessionId; public HttpServletRequestWrapper(HttpServletRequest request, HttpServletResponse response) { super(request); sessionIdManage(request, response); } @SuppressWarnings({ "rawtypes", "unchecked" })private void sessionIdManage(HttpServletRequest request, HttpServletResponse response) { Cookie[] cookies = request.getCookies(); if (cookies == null ) { // logger.warn("request.getCookies() returns null,I didn't see it before"); } else { for (int i = 0; i < cookies.length; i++) { Cookie sCookie = cookies[i]; if (sCookie.getName().equals(cookieId)) { sessionId = sCookie.getValue(); } } } if (sessionId == null || sessionId.length() == 0) { sessionIdCreate(response); } HashOperations hashOps = WebComponentFactory.getSessionRedisTemplate().opsForHash(); Long lastAccessedTime = (Long) hashOps.get(sessionId, sessionHoldKey); long maxInactiveInterval = request.getSession().getMaxInactiveInterval() * 1000; if (lastAccessedTime == null || maxInactiveInterval > 0 && System.currentTimeMillis() - lastAccessedTime > maxInactiveInterval) { sessionIdCreate(response); } hashOps.put(sessionId, sessionHoldKey, System.currentTimeMillis()); WebComponentFactory.getSessionRedisTemplate().expire(sessionId,3, TimeUnit.DAYS); } private void sessionIdCreate(HttpServletResponse response) { sessionId = java.util.UUID.randomUUID().toString(); Cookie mycookies = new Cookie(cookieId, sessionId); mycookies.setPath("/"); response.addCookie(mycookies); } public HttpSession getSession(boolean create) { return new HttpSessionSidWrapper(this.sessionId, super.getSession(create)); } public HttpSession getSession() { return new HttpSessionSidWrapper(this.sessionId, super.getSession()); }}
上面这段代码是session共享的关键部分,这里需要了解cookie和session的机制,这里是用一个自己的cookie存了自己生成的sessionId返回给客户端,每次请求在根据cookie的值来做session的操作,sessionId是存在redis里面的,根据session做redis的get,set等操作,代码也很容易看懂。
完整源代码下载地址
阅读全文
0 0
- 基于redis的session共享实现
- 基于Redis Cluster的Tomat的Session共享实现
- Tomcat7基于Redis的Session共享
- Tomcat7基于Redis的Session共享
- 基于redis缓存的session共享
- 基于Redis的Tomcat集群Session共享
- tomcat集群-基于redis的session共享
- tomcat集群-基于redis的session共享
- Tomcat7基于Redis的Session共享
- 基于nginx tomcat-redis-session-manager实现session共享
- redis实现session共享
- redis实现session共享
- Redis实现Session共享
- redis实现session共享
- redis实现session共享
- 基于Spring session data redis的session共享
- 基于Spring session 和 redis 的session共享问题
- Redis实现分布式session功能的共享
- java内部类和静态内部类
- Java9 基于异步响应流的发布-订阅框架
- 了解 Quorum
- 七牛java抓取上传第三方资源
- Linux 内存使用情况检查
- 基于redis的session共享实现
- cookie的值不能为中文
- tensorflow笔记 :常用函数说明
- 延迟链接数据库方法
- ABBYY FineReader Pro for Mac完整功能汇总(一)
- Java数据结构与算法之数据结构-逻辑结构-集合(四)------集合之Collection接口
- Linux 之语句
- C语言小碎片六
- UVA 1521 数论 + 贪心