java项目使用memcache实现session共享+session基础
本文章主要目的是配置session共享,为了巩固基础,捎带介绍了一些基础知识(网上搜索后觉得最全面的特引过来,节省时间),基础扎实的可以自动忽略。
基础篇:
2.如何封装request和session这两个web项目中最常用的对象(以解决乱码为例)
进阶篇:
3.利用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; public class HttpSessionSidWrapper extends HttpSessionWrapper { private String sid = "";
private Map map = new HashMap();
private SpyMemcachedManager spyMemcachedManager; @SuppressWarnings("rawtypes")
public HttpSessionSidWrapper(String sid, HttpSession session, SpyMemcachedManager spyMemcachedManager) {
super(session); if (spyMemcachedManager == null) {
System.out.println("spyMemcachedManager is null.....");
return;
}
this.spyMemcachedManager = spyMemcachedManager;
this.sid = sid;
Map memSession = 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) {
Enumeration<String> names = session.getAttributeNames();
while (names.hasMoreElements()) {
String key = (String) names.nextElement();
memSession.put(key, session.getAttribute(key));
}
}
}
this.map = memSession;
} public Object getAttribute(String key) {
if (this.map != null && this.map.containsKey(key)) {
return this.map.get(key);
} else {
return null;
}
} @SuppressWarnings({ "unchecked", "rawtypes" })
public Enumeration getAttributeNames() {
return (new Enumerator(this.map.keySet(), true));
// return super.getAttributeNames();
} public void invalidate() {
// super.invalidate();
this.map.clear();
long s1= System.currentTimeMillis();
try {
spyMemcachedManager.delete(sid);
System.out.print("removeSession sid is:" + sid);
}
finally{
System.out.println(System.currentTimeMillis() -s1);
}
} public void removeAttribute(String name) {
// super.removeAttribute(name);
this.map.remove(name);
attributeChange();
// System.out.print("removeAttribute");
// System.out.println("key : " + name);
} @SuppressWarnings("unchecked")
public void 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);
} private void attributeChange() {
spyMemcachedManager.set(sid, this.map, Constants.MYFILTER_COOKIE_EXPTIME);
}
}
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:
<!-- session共享过滤器 -->
<filter>
<filter-name>mySessionFilter</filter-name>
<filter-class>com.sse.roadshow.filter.MemcachedSessionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>mySessionFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
这样session共享就配置完毕了。
http://blog.csdn.net/shandalue/article/details/41522043
java项目使用memcache实现session共享+session基础的更多相关文章
- 如何实现session共享
http://www.cnblogs.com/xiehuiqi220/p/3592300.html 首先我们应该明白,为什么要实现共享,如果你的网站是存放在一个机器上,那么是不存在这个问题的,因为会话 ...
- 【原创】搭建Nginx(负载均衡)+Redis(Session共享)+Tomcat集群
为什么移除首页?哪里不符合要求?倒是回我邮件啊! 一.环境搭建 Linux下Vagrant搭建Tomcat7.Java7 二.Nginx的安装配置与测试 *虚拟机下转至root sudo -i 1)下 ...
- 搭建Nginx(负载均衡)+Redis(Session共享)+Tomcat集群
一.环境搭建 Linux下Vagrant搭建Tomcat7.Java7 二.Nginx的安装配置与测试 *虚拟机下转至root sudo -i 1)下载并解压(目前官网最新版本) 创建安装目录:mkd ...
- linux memcached Session共享
memcached memcached是高性能的分布式缓存服务器用来集中缓存数据库查询结果,减少数据库访问次数提高动态web应用的响应速度 传统web架构的问题许多web应用都将数据保存在RDBMS中 ...
- session以及分布式服务器session共享
一.session的本质 http协议是无状态的,即你连续访问某个网页100次和访问1次对服务器来说是没有区别对待的,因为它记不住你. 那么,在一些场合,确实需要服务器记住当前用户怎么办?比如用户登录 ...
- SSO解决session共享的几种方案
之前做项目遇到了这个sso系统,当时只是理解了一部分,今天偶尔发现一篇文章,觉得写的不错,增加了sso知识: 单点登录在现在的系统架构中广泛存在,他将多个子系统的认证体系打通,实现了一个入口多处使用, ...
- nginx+iis+redis+Task.MainForm构建分布式架构 之 (redis存储分布式共享的session及共享session运作流程)
本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,上一篇分享文章制作是在windows上使用的nginx,一般正式发布的时候是在linux来配 ...
- Memcache+Tomcat9集群实现session共享(非jar式配置, 手动编写Memcache客户端)
Windows上两个tomcat, 虚拟机中ip为192.168.0.30的centos上一个(测试用三台就够了, 为了测试看见端口所以没有使用nginx转发请求) 开始 1.windows上开启两个 ...
- Nginx+Tomcat+Memcache实现负载均衡及Session共享
第一部分 环境介绍 部署环境: Host1:Nginx.Memcached.Tomcat1 Host2:Tomcat2 Tomcat_version:8.0.38 第二部分 Nginx+Tomcat实 ...
随机推荐
- ORACLE数据库不同故障下的恢复总结
ORACLE数据库不同故障下的恢复总结1. 非归档模式下丢失或损坏的文件--1.1 数据文件--启动数据库的状态到MOUNT--恢复方法:通过之前创建的数据库完整备份,修复整个数据库,不过备份之后发生 ...
- JavaScript sort()方法比较器
当我们想把一个由数字组成的数组进行简单的排序时,可能会想到sort()方法: var arr = [2 , 3, -1, -107, -14, 1]; console.log(arr.sort()) ...
- html5的改变
html5的改变 新增的元素 新增的结构元素 section.article.aside.header.hgroup.footer.nav.figure 新增的其他元素 video.audio.emb ...
- JS获取request字符串
function getQueryString(name) { var reg = new RegExp("(^|&)" + name + "=([^&] ...
- 归并排序java
import java.util.Arrays; public class MergeSort { public static void main(String[] args) { MergeSort ...
- Python-windows服务-重启自动化
一. 前言 有了上一篇的“python初学”的基础,咱们就有了python的开发包,有了开发环境IDE,那我们就可以干活了.我的第一个选题就是让我们的windows服务可以按照我们的意愿进行自动重启. ...
- 使用runtime 实现weex 跳转原生页面
一.简述 最近项目组打算引入weex,并选定了一个页面进行试水.页面很简单,主要是获取数据渲染页面,并可以跳转到指定的页面.跟之前使用RN 相比,weex 确实要简单很多.从下图中我们可以看到,wee ...
- php 支持递归函数.递归函数就是调用函数本身.
例子 将一个字符进行颠倒 function reverse_r($str){ if(strlen($str)){ reverse_r(substr($str,1));// } echo substr( ...
- 使用LINQ来简化编程的7个技巧
转载地址:http://www.cnblogs.com/lovecherry/archive/2008/05/23/1205565.html 自从学习LINQ以来,我发现了很多使用LINQ来改善代码的 ...
- 将一段含有0的字符数组赋给string
string有个成员函数,assign() 可以这样: string str; str.assign(temp, sizeof(temp));