设为首页 收藏本站
查看: 1266|回复: 0

[经验分享] memcache集中存储session

[复制链接]

尚未签到

发表于 2017-4-15 12:59:51 | 显示全部楼层 |阅读模式
摘自: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;
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共享就配置完毕了。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-365100-1-1.html 上篇帖子: 学习总结系列--Memcache mutex设计模式 下篇帖子: Magento使用Memcache做缓存和Session
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表