`
goodsense
  • 浏览: 31975 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

分布式Session的一个实现.

    博客分类:
  • Java
阅读更多

本来一个Tomcat集群4台服务器工作的很好,随着访问量的增加本来的粘性Session方式的配置没办法很好的一碗水端平了.Session复制的话对于网络又是一个负担,所以才自己实现了一套利用Memcache的Session实现. 

网上已经有很多这样的实现了,比如修改Tomcat的Manager的http://code.google.com/p/memcached-session-manager/. 

但由于我这里还有其他的Servlet容器,所以也就没有使用完全自己实现了一套,现在运行在www.etnet.com.cn网站上. 

从那开始呢....其他的Servlet容器我总不能再一一去实现吧。。。。最后还是决定使用过滤器来偷梁换柱了. 

先是  CacheSessionFilter ,这个过滤器负责将普通的HttpServletRequest替换成我们自己的实现. 

Java代码   收藏代码
  1. public class CacheSessionFilter extends BaseFilter {  
  2.   
  3.     **  
  4.      * 替换原始的Request,修改为  
  5.      * com.etnetchina.servlet.wrapper.CacheSessionHttpServletReqeust。  
  6.      * 并根据是否新生成了Session来更新客户端的cookie.  
  7.      *   
  8.      * @param request 请求。  
  9.      * @param response 响应。  
  10.      * @param chain 下一个过滤器。  
  11.      * @throws java.io.IOException  
  12.      * @throws javax.servlet.ServletException  
  13.      */  
  14.     public void doFilter(  
  15.             ServletRequest request,  
  16.             ServletResponse response,  
  17.             FilterChain chain)  
  18.             throws IOException, ServletException {  
  19.         logger.debugLog("CacheSessionFilter to work.");  
  20.   
  21.         HttpServletRequest httpRequest = (HttpServletRequest) request;  
  22.         HttpServletResponse httpResponse = (HttpServletResponse) response;  
  23.   
  24.         CacheSessionHttpServletReqeust cacheRequest =  
  25.                 new CacheSessionHttpServletReqeust(  
  26.                 httpRequest,  
  27.                 httpResponse,  
  28.                 filterConfig.getServletContext());  
  29.         cacheRequest.setSessionCookieName(sessionCookieName);  
  30.         cacheRequest.setMaxInactiveInterval(maxInactiveInterval);  
  31.         cacheRequest.setCookieDomain(cookieDomain);  
  32.         cacheRequest.setCookieContextPath(cookieContextPath);  
  33.         cacheRequest.setSessionAttributeListeners(sessionAttributeListeners);  
  34.         cacheRequest.setSessionListeners(sessionListeners);  
  35.   
  36.         chain.doFilter(cacheRequest, httpResponse);  
  37.   
  38.         CacheHttpSession cacheSession = cacheRequest.currentSession();  
  39.         if (cacheSession != null) {  
  40.             if (!cacheSession.synchronizationCache()) {  
  41.                 WebUtil.failureCookie(  
  42.                         httpRequest,  
  43.                         httpResponse,  
  44.                         sessionCookieName,  
  45.                         cookieDomain,  
  46.                         cookieContextPath);  
  47.             }  
  48.         }  
  49.     }  
  50. }  



这个过滤器的核心就是doFilter方法了,做了三件事. 
第一是替换HttpServletRequest. 
第二是如果Session失效,负责删除Cookie中的SessionId. 
最后一件就是如果Session中的数据被改变了同步到缓存中. 

现在重点是我们换上的CacheHttpServletRequest有什么用呢,很简单只是在应用调用getSession()方法时返回我们实现的Session.其核心的代码很简单,如下. 

Java代码   收藏代码
  1. private HttpSession doGetSession(boolean create) {  
  2.         if (cacheSession != null) {  
  3.             //local,return.  
  4.             logger.debugLog("Session[{0}] was existed.", cacheSession.getId());  
  5.         } else {  
  6.             Cookie cookie = WebUtil.findCookie(this, getSessionCookieName());  
  7.             if (cookie != null) {  
  8.   
  9.                 logger.debugLog("Find session`s id from cookie.[{0}]",  
  10.                         cookie.getValue());  
  11.   
  12.                 cacheSession = buildCacheHttpSession(cookie.getValue(), false);  
  13.             } else {  
  14.                 cacheSession = buildCacheHttpSession(create);  
  15.             }  
  16.         }  
  17.   
  18.         if (cacheSession != null) {  
  19.             //dead?  
  20.             if (cacheSession.isInvalid()) {  
  21.                 cacheSession.invalidate();  
  22.                 cacheSession.synchronizationCache();  
  23.                 cacheSession = buildCacheHttpSession(create);  
  24.             }  
  25.   
  26.             if (cacheSession != null) {  
  27.                 cacheSession.access();  
  28.             }  
  29.         }  
  30.   
  31.         return cacheSession;  
  32. }  



getSession()和getSession(boolean)方法实际调用的就是这个方法,为了减少创建的损耗在一次请求中利保只会创建一次.最后更新一下这个Session的最后访问时间. 

每一次请求结束,都会进行一次缓存同步.由于每次讲求都会造成访问时间的更新,所以这个值是一直会被put到缓存中的. 

启用只需要在web.xml做如下配置. 

Xml代码   收藏代码
  1. <filter>  
  2.         <description>修改默认的Session储存机制,改为使用某个缓存来储存。</description>  
  3.         <filter-name>CacheSessionFilter</filter-name>  
  4.         <filter-class>com.etnetchina.servlet.filter.session.CacheSessionFilter</filter-class>  
  5.         <init-param>  
  6.             <description>sessionId在Cookie中的名称</description>  
  7.             <param-name>sessionCookieName</param-name>  
  8.             <param-value>etnetsessionid</param-value>  
  9.         </init-param>  
  10.         <init-param>  
  11.             <description>Session的最大不活动时间(秒)</description>  
  12.             <param-name>maxInactiveInterval</param-name>  
  13.             <param-value>60</param-value>  
  14.         </init-param>  
  15.     </filter>  



还可以有以下参数可配置 
cookieDomain为存放cookie的域设置。默认为null. 
cookieContextPath为存放cookie的路径。如果不设置将使用默认的contextPath. 
sessionAttributeListeners 为HttpSessionAttributeListener监听器实现类全限定名,多个名称以","分隔. 
sessionListeners 为HttpSessionListener监听器实现类的全限定名,多个名称以","分隔. 

Xml代码   收藏代码
  1. <filter-mapping>  
  2.         <filter-name>CacheSessionFilter</filter-name>  
  3.         <url-pattern>/*</url-pattern>  
  4. </filter-mapping>  


加上一个过滤器就行了. 

 

 

其他分布式缓存实现方法

https://code.google.com/p/memcached-session-filter/

分享到:
评论

相关推荐

    基于springcloud分布式session共享.docx.docx

    在分布式系统环境中,Session共享...以上是Spring Cloud环境下实现分布式Session共享的基本原理和常见问题的解决方案。正确配置和使用这些策略,能够确保用户在分布式系统中的体验一致性,提升系统的健壮性和可扩展性。

    一文读懂分布式Session常见解决方案.docx

    例如,当一个服务器接收到新的Session数据时,它会将这些数据广播给集群中的其他服务器。Tomcat等Web容器提供了内置的支持。优点是简单易实施,无需依赖外部存储系统。但是,这种方法可能导致较高的网络带宽消耗和...

    基于ZooKeeper的分布式Session实现

    本文将深入探讨如何利用ZooKeeper实现分布式Session,并通过分析提供的"基于ZooKeeper的分布式Session实现.doc"文档,解析其实现原理与步骤。 首先,理解ZooKeeper的基本概念至关重要。ZooKeeper是一个高可用、高...

    zookeeper实现分布式session sample

    本示例将探讨如何利用Zookeeper实现分布式session。 1. **Zookeeper的基本概念** - Zookeeper是一个分布式服务框架,主要用于解决分布式应用中的数据一致性问题。 - 它提供了一种树形的数据结构,节点称为Znode,...

    面试官:集群部署时,分布式 session 如何实现?.docx

    图文并茂吃透面试题,看完这个,吊打面试官,拿高薪offer!

    基于redis的分布式session实现

    分布式Session实现是现代Web应用程序中解决用户会话跨服务器共享问题的关键技术。在高并发、大规模部署的网络环境中,单一服务器往往无法满足处理需求,此时就需要通过负载均衡将请求分发到多台服务器上。然而,传统...

    【ASP.NET编程知识】ASP.NET通过分布式Session提升性能.docx

    Memcached Provider是ASP.NET 的一个提供程序,它允许开发者使用Memcached来实现分布式Session机制。 使用Memcached Provider可以将Session数据存储在Memcached中,而不是单个服务器上。这可以大大提高Session处理...

    基于ZooKeeper的分布式Session实现_已发布.docx

    【基于ZooKeeper的分布式Session实现】 ZooKeeper是一个分布式协调服务,源于Apache Hadoop项目,现已成为一个独立的子项目。它旨在提供高可用性、高性能的协调服务,适用于分布式环境中的命名、配置管理、同步和组...

    分布式Session解决方案.docx

    在本文中,我们将深入探讨分布式Session存在的问题、现有的解决方案,以及在一个实际项目中的应用实例。 **分布式Session存在的问题** 1. **Session不共享**:当用户在集群中的不同服务器之间切换时,由于每个...

    spring session redis分布式session

    为了解决这个问题,Spring Session提供了一种优雅的解决方案,特别是结合Redis作为持久化存储时,可以实现高效的分布式Session管理。本文将详细介绍Spring Session与Redis集成,以及如何自定义Session来应对分布式...

    秒杀实战 redis nginx 分布式session-secKill.zip

    在“秒杀实战 redis nginx 分布式session-secKill”项目中,我们将探讨如何利用Redis、Nginx以及分布式Session技术来构建一个高效、稳定的秒杀系统。 首先,Redis是一个高性能的键值存储系统,它被广泛用于缓存应用...

    43_说说你们的分布式session方案是啥?怎么做的?.zip

    在Java开发中,常见的分布式Session实现方式有以下几种: 1. **Session复制**:这是一种简单的策略,即在集群中的每个节点都复制一份完整的Session数据。每当Session发生变化时,都会广播给其他节点。但是,这种...

    分布式Session一致性解决方案.docx

    接下来,我们将探讨几种常见的分布式Session一致性实现方案。 #### 二、实现方案 ##### 1. Session复制 **定义:** Session复制是指通过配置Web服务器使其能够在多个服务器之间同步Session信息的一种机制。 **...

    使用redis实现分布式session

    当用户登录后,服务器会在内存中创建一个Session对象,将用户的登录信息等状态数据存储在这个对象中,并为该Session分配一个唯一的Session ID,通过Cookie返回给客户端浏览器。下次请求时,客户端携带Session ID,...

    【ASP.NET编程知识】浅谈ASP.NET Core中间件实现分布式 Session.docx

     // 调用下一个中间件 await _next(context); } } 1.3. 分布式 Session 实现 在 ASP.NET Core 中,Session 是一种存储用户会话数据的方式,但默认的内存存储方式并不适合多服务器部署。为了解决这个问题,ASP...

    分布式服务集群下实现session共享解决方案.docx

    在分布式服务集群环境中,session共享是一个关键挑战,因为传统的session保存在单一服务器上,当用户在集群中的不同服务器之间切换时,会导致session丢失。本文主要探讨了几种在分布式系统中实现session共享的解决...

    springboot+dubbo分布式架构,提供分布式缓存、分布式锁、分布式Session、读写分离

    缓存和Session:注解redis缓存数据,Spring-session和redis实现分布式session同步,重启服务会话不丢失。 数据同步:基于redis的分布式锁。 Web安全:实现XSS过滤和CSR过滤。 多系统交互:Dubbo,ActiveMQ多系统交互...

Global site tag (gtag.js) - Google Analytics