`

memcache集中存储session

 
阅读更多
摘自:http://www.th7.cn/Program/java/201411/323454.shtml
利用memcache实现session共享

在开发过程中,为了缓解访问压力,往往需要配置负载均衡,也就是相同的项目放在多台机子上,保证一台机子挂了,网站仍然可以正常访问,除了需要使用相同的数据源,资料源之外,最大的问题莫过于session的共享了。这里session共享的核心在于改变原来session中的键值对存放在每台机子各自的内存中的情况,而是把session中的内容集中存放在一个nosql数据库中。

3.1封装request对象:
package com.sse.roadshow.session;


import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;


import com.sse.roadshow.common.SpyMemcachedManager;


public class HttpServletRequestWrapper extends
javax.servlet.http.HttpServletRequestWrapper {


String sid = "";

private SpyMemcachedManager spyMemcachedManager;


public HttpServletRequestWrapper(String sid, HttpServletRequest request,SpyMemcachedManager spyMemcachedManager) {
super(request);
this.sid = sid;
this.spyMemcachedManager = spyMemcachedManager;
}


public HttpSession getSession(boolean create) {
return new HttpSessionSidWrapper(this.sid, super.getSession(create), this.spyMemcachedManager);
}


public HttpSession getSession() {
return new HttpSessionSidWrapper(this.sid, super.getSession(), this.spyMemcachedManager);
}


}

通过封装传递数据源,并且覆盖getSession方法,自定义的session对象在下一步

3.2封装session对象
package com.sse.roadshow.session;

import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpSession;
import com.sse.roadshow.common.Constants;
import com.sse.roadshow.common.SpyMemcachedManager;
import com.sse.roadshow.vo.Enumerator;

publicclass HttpSessionSidWrapper extends HttpSessionWrapper {

private Stringsid = "";
privateMap map =new HashMap();
private SpyMemcachedManagerspyMemcachedManager;

@SuppressWarnings("rawtypes")
public HttpSessionSidWrapper(Stringsid, HttpSession session, SpyMemcachedManagerspyMemcachedManager) {
super(session);

if (spyMemcachedManager ==null) {
System.out.println("spyMemcachedManager is null.....");
return;
}
this.spyMemcachedManager =spyMemcachedManager;
this.sid =sid;
MapmemSession = null;
memSession = (Map)this.spyMemcachedManager.get(sid);
//sid没有加入到session中,需要初始化session,替换为自定义session
if (memSession ==null) {
// System.out.println("memSession is null");
memSession =new HashMap();
// this.spyMemcachedManager.set(sid, memSession, Constants.SPMEM_EXPTIME);
if (session !=null) {
Enumerationnames = session.getAttributeNames();
while (names.hasMoreElements()) {
Stringkey = (String) names.nextElement();
memSession.put(key,session.getAttribute(key));
}
}

}
this.map =memSession;
}

public Object getAttribute(Stringkey) {
if (this.map !=null && this.map.containsKey(key)) {
returnthis.map.get(key);
}else {
returnnull;
}
}

@SuppressWarnings({"unchecked", "rawtypes" })
public Enumeration getAttributeNames() {
return (new Enumerator(this.map.keySet(),true));
// return super.getAttributeNames();
}

publicvoid invalidate() {
// super.invalidate();
this.map.clear();
longs1= System.currentTimeMillis();
try {
spyMemcachedManager.delete(sid);
System.out.print("removeSession sid is:" +sid);
}
finally{
System.out.println(System.currentTimeMillis() -s1);
}
}
publicvoid removeAttribute(String name) {
// super.removeAttribute(name);
this.map.remove(name);
attributeChange();
// System.out.print("removeAttribute");
// System.out.println("key : " + name);
}

@SuppressWarnings("unchecked")
publicvoid setAttribute(String name, Object value) {
// super.setAttribute(name, value);
this.map.put(name,value);
attributeChange();
// System.out.print("setAttribute-");
// System.out.println("key : " + name + ", value : " + value);
}
privatevoid attributeChange() {
spyMemcachedManager.set(sid,this.map, Constants.MYFILTER_COOKIE_EXPTIME);
}
}

这里覆盖session的操作方法,取值使用我们从memcache中查出来的数据

3.3引入我们刚才封装好的request对象:
使用过滤器过滤对应路径的请求,引入自定义request:
3.3.1自定义过滤器:
package com.sse.roadshow.filter;


import java.io.IOException;


import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


import org.springframework.web.context.support.WebApplicationContextUtils;


import com.sse.roadshow.common.Constants;
import com.sse.roadshow.common.SpyMemcachedManager;
import com.sse.roadshow.common.Util;
import com.sse.roadshow.session.HttpServletRequestWrapper;


public class MemcachedSessionFilter extends HttpServlet implements Filter {


/**
* 
*/
private static final long serialVersionUID = 8928219999641126613L;


// private FilterConfig filterConfig;


private String cookieDomain = "";


private String cookiePath = "/";

private SpyMemcachedManager spyMemcachedManager;


public void doFilter(ServletRequest servletRequest,
ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
String sessionId = "XmlBeanDefinitionReaderSid";

HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;


Cookie cookies[] = request.getCookies();
Cookie sCookie = null;


String sid = "";
if (cookies != null && cookies.length > 0) {
for (int i = 0; i < cookies.length; i++) {
sCookie = cookies[i];
if (sCookie.getName().equals(sessionId)) {
sid = sCookie.getValue();
}
}
}


if (sid == null || sid.length() == 0) {
sid = java.util.UUID.randomUUID().toString();
Cookie mycookies = new Cookie(sessionId, sid);
mycookies.setMaxAge(-1);
mycookies.setPath("/");
mycookies.setHttpOnly(true);
mycookies.setDomain(Constants.DOMAIN);
response.addCookie(mycookies);
}
spyMemcachedManager = getBean(request);
filterChain.doFilter(new HttpServletRequestWrapper(sid, request, spyMemcachedManager),
servletResponse);
}


private SpyMemcachedManager getBean(HttpServletRequest request) {
if(Util.isNull(spyMemcachedManager)) {
spyMemcachedManager = WebApplicationContextUtils.getWebApplicationContext(request.getServletContext()).getBean(SpyMemcachedManager.class);
}
return spyMemcachedManager;
}

public void init(FilterConfig filterConfig) throws ServletException {
// this.filterConfig = filterConfig;
// this.sessionId = filterConfig.getInitParameter("sessionId");
this.cookiePath = filterConfig.getInitParameter("cookiePath");
if (this.cookiePath == null || this.cookiePath.length() == 0) {
this.cookiePath = "/";
}

this.cookieDomain = filterConfig.getInitParameter("cookieDomain");
if (this.cookieDomain == null) {
this.cookieDomain = Constants.DOMAIN;
}
}


public SpyMemcachedManager getSpyMemcachedManager() {
return spyMemcachedManager;
}


public void setSpyMemcachedManager(SpyMemcachedManager spyMemcachedManager) {
this.spyMemcachedManager = spyMemcachedManager;
}


}

3.3.2.在web.xml中配置filter:
mySessionFilter
com.sse.roadshow.filter.MemcachedSessionFilter
mySessionFilter
/*

这样session共享就配置完毕了。
分享到:
评论

相关推荐

    tomcat6 memcache session manager session共享 jar包下载

    1. `msm-core.jar`: 这是Memcached Session Manager的核心库,包含了处理Session存储和检索的主要逻辑。 2. `memcached-client.jar`: 这是连接和操作Memcache服务器的客户端库,提供了与Memcache交互的API。 3. `...

    PHP实现多服务器session共享之memcache共享.rar

    2. **修改PHP配置**:在php.ini文件中,设置session存储handler为memcache。例如,添加以下行: ``` session.save_handler = memcached session.save_path = "tcp://server1:11211;tcp://server2:11211;tcp://...

    集群环境下memcache解决session共享

    在Tomcat8中,我们可以通过添加第三方库来支持memcache作为session存储。 "memcache-session"这个文件名很可能是指一个实现memcache session管理的Java库,它可能包含以下组件: 1. `MemcachedSessionManager`:这...

    PHP中使用memcache存储session的三种配置方法

    1、直接修改php.ini配置文件 复制代码 代码如下: session.save_handler = memcache //设置session的储存方式为memcache memcache.hash_strategy = “consistent”//设置memcache的hash算法 session.save_path = ...

    Nginx+tomcat6+memcache配置集群session共享所需jar包

    在这个配置中,我们将使用Memcached来存储session数据,确保所有Tomcat节点都能访问到相同的数据。提供的jar包“memcache-session-manager”就是用来实现这一功能的。该组件允许Tomcat将session对象序列化并存储到...

    memcache共享session用到的jar

    2. **配置Session管理器**:在Web应用的配置文件(如web.xml)中,设置session管理器,指定使用Memcache作为session存储的后端。 3. **初始化Memcache连接**:在应用启动时,建立与Memcache服务器的连接,并设置好...

    Ubuntu server 11.04安装memcache及php使用memcache来存储session的方法

    本文实例讲述了Ubuntu server 11.04安装memcache及php使用memcache来存储session的方法。分享给大家供大家参考,具体如下: 1、首先安装memcache服务端: sudo apt-get install memcached 安装完成后系统 自动启动...

    session共享之memcache Redis

    将Session数据存储在memcache中,可以让多台服务器通过网络访问同一个Session,实现Session共享。在PHP中,可以使用`memcached`扩展来操作memcache。例如,`SessionMemcache.php`文件可能包含了以下代码: ```php $...

    tomcat7 通过memcache 实现 session共享依赖包

    3. **memcached-session-manager-2.0.0.jar**:这是Memcached Session Manager的核心库,它负责处理session的存储、恢复和过期策略,使得Tomcat能够将session数据透明地存储在Memcache中。 4. **kryo-serializers-...

    memcache-session序列化

    tomcat kryo memcache session序列化 msm-memcached-session-manager-1.8.2

    tomcat7通过memcache 实现 session共享

    通过memcache实现tomcat7的session共享,目前生产环境用的不多了,但自己某个小需求用到,版本冲突好几次,分享给大家,这3个包复制到tomcat的 lib目录下 还有两个包需要 maven引入自己的项目中 &lt;!-- memcache ...

    基于php使用memcache存储session的详解

    最后,可以通过Memcache客户端查询存储在Memcache中的session数据,确保session数据已经被正确地存储在Memcache中。 ```php $memcache = memcache_connect('localhost', 11211); var_dump($memcache-&gt;get('***c65...

    Memcache Session Manager + Tomcat8.5.6

    Memcache作为session存储,使得所有服务器都能访问到同一份session数据。 3. **Nginx**: Nginx是一个高性能的HTTP和反向代理服务器,它可以根据负载均衡策略将请求分发到多个后端服务器,提高了系统的并发处理能力...

    在php中设置session用memcache来存储的方法总结

    首先,要启用Memcache或Memcached作为session存储,需要设置`session.save_handler`为`memcache`或`memcached`,具体取决于你安装的是哪个扩展。此外,还需要设置`session.save_path`来指定连接到的Memcache服务器...

    session共享 tomcat+nginx+memcache

    本压缩包提供的资源是为了解决这个问题,通过集成Memcached来实现Session的集中式管理,从而实现跨服务器的Session共享。 首先,让我们深入了解每个组件的作用: 1. **Tomcat**:Apache Tomcat是一款开源的Java ...

Global site tag (gtag.js) - Google Analytics