memcached-session-filter 项目是在 java 服务器(例如:tomcat)集群的情况下,通过 filter 实现 session 共享。
项目地址:http://code.google.com/p/memcached-session-filter/
非常棒的东东,但是需要在 spring 下使用,而且 session 中的对象必须实现 java 序列化接口。
刚好现有的项目中不幸被以上两点限制了,只能自己动手修改一下。
首先有三点小的调整和修复了一个小的问题:
1、原有 memcached 的 java 客户端使用的 xmemcached 修改为 spymemcached 。
2、对于 commons-lang 包,作者只使用了 StringUtils.isEmpty 的方法,所以也被替换掉了。
3、将日志组件从 log4j 改为 slf4j 。
小问题放在后面说。
一、摆脱 spring
涉及 MemcachedSessionManager 和 MemcachedSessionFilter 两个类。
MemcachedSessionManager 类:
// 此接口在 filter 中设置 memcachedClient 对象
public void setMemcachedClient(MemcachedClient memcachedClient) {
this.memcachedClient = memcachedClient;
}
// 此接口在 filter 中设置 session 过期时间
public void setMaxInactiveInterval(int maxInactiveInterval) {
this.maxInactiveInterval = maxInactiveInterval;
}
MemcachedSessionFilter 类:
public void init(FilterConfig filterConfig) throws ServletException {
// 创建 sessionManager
sessionManager = new MemcachedSessionManager();
// 解析配置参数,设置 session 过期时间
String maxInactiveInterval = filterConfig.getInitParameter("maxInactiveInterval");
if(maxInactiveInterval != null) {
try {
int i = Integer.valueOf(maxInactiveInterval);
sessionManager.setMaxInactiveInterval(i);
} catch(Exception e) {
e.printStackTrace();
}
}
// 设置 memcached 服务节点
String memcachedNodes = filterConfig.getInitParameter("memcachedNodes");
if(memcachedNodes != null) {
this.memcachedNodes = memcachedNodes;
}
try {
MemcachedClient client = new MemcachedClient(AddrUtil.getAddresses(this.memcachedNodes));
sessionManager.setMemcachedClient(client);
} catch (Exception e) {
e.printStackTrace();
}
}
二、摆脱 java 序列化接口
序列化使用了javolution 包,项目地址:http://www.javolution.org/
主要参考了 memcached-session-manager 的序列化的实现,项目地址:http://code.google.com/p/memcached-session-manager
代码比较多,以下主要说一下思路和主要修改的 java 文件。
MemcachedHttpSession 类:增加新的方法,用于操作 session 内部的 Map 数据
public Map<String, Object> getAttributesInternal() {
return this.data;
}
void setAttributesInternal( final Map<String, Object> attributes ) {
this.data = attributes;
}
TranscoderService 类:序列化 session 对象
// 需要根据 MemcachedHttpSession 的结构进行相应的修改
static final int NUM_BYTES = 8 // creationTime: long
+ 8 // lastAccessedTime: long
+ 4 // maxInactiveInterval: int
+ 0; // isNew: boolean
【注】serializeSessionFields 和 deserializeSessionFields 等方法也要相应调整。
JavolutionTranscoder 类:该类实现了 spymemcached 的 SerializingTranscoder 用于取出 session 对象时反序列化操作;另外,负责对象和 XML 之间的相互转化
MemcachedSessionManager 类:
private SerializingTranscoder upgradeSupportTranscoder = new JavolutionTranscoder();
private TranscoderService transcoderService = new TranscoderService(new JavolutionTranscoder());
...
// 过期删除
if(session.expired) {
memcachedClient.delete(generatorSessionKey(session.id));
} else {
try {
final Map<String, Object> attributes = session.getAttributesInternal();
// 序列化
final byte[] attributesData = transcoderService.serializeAttributes( session, attributes );
final byte[] data = transcoderService.serialize( session, attributesData );
// 保存 session 到 memcached
memcachedClient.set(generatorSessionKey(session.id), session.maxInactiveInterval+expirationUpdateInterval, data);
} catch(Exception e) {
//
}
}
....
// 从 memcached 取得 session 对象,并且对它反序列化
Object obj = memcachedClient.get(generatorSessionKey(sessionId), this.upgradeSupportTranscoder);
【注】前面说的一个问题:
后面在使用的过程中,发现使用 绿色浏览器 时,session 无法保存到 memcached 中。
原因很简单,该组件通过 cookie 保存 session id ,在创建 cookie 时,未设置过期时间,所以通过 cookie.setMaxAge(maxInactiveInterval); 即可解决。
分享到:
相关推荐
Kryo以其高效的序列化和反序列化速度而闻名,可以显著提升Memcached操作session的速度。而"高性能缓存"则强调了Memcached作为缓存系统的主要优点,即提供高速的数据访问。 压缩包内的"memcached-session-manager-tc...
2. **Java Servlet会话管理**:在Java Web开发中,Servlet规范定义了会话接口HttpSession,memcached-session-manager 是一个实现该接口的第三方库,允许开发者将默认的基于内存的会话存储替换为分布式存储。...
memcached-1.9.6,libevent-2.1.12-stable.tar memcached-session-manager-1.9.6,msm-kryo-serializer-1.9.6.jar,tomcat8.5,实现会话共享
【描述】:“Memcached-session-manager所需的jar包-tomcat7-kryo序列”意味着为了实现Tomcat7服务器对用户会话的高效存储和管理,开发者选择了Memcached-session-manager这一中间件,并且采用了Kryo序列化技术。...
依照文档部署即可实现多服务器多tomcat session共享,jar包中是tomcat7集成所需要的jar包,序列化工具用的是java默认的序列化工具,若要使用其他版本的tomcat或其他的序列化工具,更具文档自己替换jar包即可,附赠...
`MemcachedSessionManager`是负责在Tomcat和Memcached之间传输session数据的类,而`Transcoder`则负责序列化和反序列化session对象,确保它们能在网络间安全传输。 安装`memcached-session-manager`,你需要在...
"工具"标签则表明`memcached-session-manager`是一个实用工具,用于在Java Web应用中处理session的持久化和分布式存储,可能是通过提供API或者配置选项来实现。 **文件名解析:** "tomcat7"可能是教程中涉及的一个...
适应MSM的整合包,有 flexjson-3.3 msm-flexjson-serializer-1.9.6 msm-spymemcached-2.11.3 memcached-session-manager-1.9.6 memcached-session-manager-tc8-1.9.6
memcached-session-manager-1.6.5.jar
memcached-session-manager-tc6-1.6.3.jar
Memcached-session-manager是Java应用程序,用于在Tomcat或其他基于Servlet的容器中管理会话,并将其存储在Memcached中,以实现会话的分布式和高可用性。 首先,我们需要理解会话管理在Web应用中的重要性。会话允许...
"memcached-session-manager_4_tomcat8" 这个标题表明我们正在讨论一个针对Tomcat 8.0.33版本的session管理器,它使用了memcached作为持久化存储。memcached是一种分布式内存对象缓存系统,常用于减轻数据库负载,...
2. **memcached-session-manager-1.8.3.jar**:这是核心组件,实现了会话管理器接口,使得Tomcat能够利用memcached存储和检索会话数据。它负责处理会话的创建、读取、更新和删除操作,并提供各种序列化策略。 3. **...
此外,还需要在项目中添加memcached-session-manager-1.8.1.jar及其依赖库,如Spymemcached,到类路径中。 四、性能优化 1. **Session超时**:合理设置session的超时时间,避免过多无效数据占用Memcached资源。 2...
总的来说,Memcached Session Manager 1.6.5是一个高效、可靠的会话管理解决方案,它通过与Memcached的集成,为Java Web应用提供了强大的会话持久化和分布式管理能力,是现代高并发、大数据量场景下的理想选择。...
本lib包包含:javolution-5.5.1.jar、kryo-1.03.jar、kryo-serializers-0.10.jar、memcached-2.5.jar、memcached-session-manager-1.5.1.jar、memcached-session-manager-tc7-1.5.1.jar、minlog-1.2.jar、msm-...
memcached-session-manager-tc7