java项目使用memcache实现session共享+session基础

本文章主要目的是配置session共享,为了巩固基础,捎带介绍了一些基础知识(网上搜索后觉得最全面的特引过来,节省时间),基础扎实的可以自动忽略。

基础篇:

1.了解java web中的session与cookie。

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);

}

}

这里覆盖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:

<!-- 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共享就配置完毕了。

时间: 2025-01-03 18:00:35

java项目使用memcache实现session共享+session基础的相关文章

tomcat + memcached session共享session

开发快报: websocket 强制下线功能,玩转websocket技术 ------------------------------------------------------------------------------------------------------------------------- A 代码生成器(开发利器);   增删改查的处理类,service层,mybatis的xml,SQL( mysql   和oracle)脚本,   jsp页面 都生成 就不用写搬砖的

Nginx+Tomcat+Memcache实现负载均衡及Session共享

第一部分 环境介绍 部署环境: Host1:Nginx.Memcached.Tomcat1 Host2:Tomcat2 Tomcat_version:8.0.38 第二部分 Nginx+Tomcat实现负载均衡 1.nginx及tomcat的安装省略 2.nginx负载均衡配置: http标签中定义tomcat集群: upstream tomcat_server { server 101.200.229.38:8080; server 101.200.162.214:8080; } server

windows下nginx+tomcat+memcache负载均衡tomcat集群session共享搭建

使用nginx 做负载均衡 memcached处理session共享  环境 windows 7  X64  java : jdk-7windows-x64.rar  nginx : http://nginx.org/en/download.html ,这里我们推荐下载稳定版(stable versions),本文采用nginx-1.8.0  tomcat:apache-tomcat-7.0.63 在同一台电脑上配置多个tomcat(本次采用两个tomcat来示范),修改 conf/server

tomcat session共享: 同tomcat不同项目之间的session共享

有时我们会遇到一个大点的项目,为了方便实现有些功能,我们会把项目拆成不同的独立web项目. 但我们在管理这些项目时,只有一个登陆口,然后在其他项目取session来实现身份的验证. 查看tomcat 关于 HTTP Connector中有个emptySessionPath 其解释如下: If set to true, all paths for session cookies will be set to /. This can be useful for portlet specificati

同一个tomcat多个项目共享session,一个tomcat两个项目共享sessionId

同一个tomcat多个项目共享session,一个tomcat两个项目共享sessionId >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ?Copyright 蕃薯耀 2017年7月12日 http://www.cnblogs.com/fanshuyao/ 一个是2个项目,一个是web-sess

分布式集群环境下,如何实现session共享二(项目开发)

在上一篇分布式集群环境下,如何实现session共享一(应用场景)中,介绍了在分布式集群下,需要实现session共享的应用场景.并且最后留下了一个问题:在集群环境下,如何实现session的共享呢?.要解决这个问题,放在一篇中内容量有点大,还是一步一步来吧.本篇先搭建一个基础的web应用,完全基于原生态的servlet实现.思路是这样的: 1.准备一个页面index.jsp,页面中可以提交key/value对的请求参数数据数据 2.编写一个servlet,接收页面提交的请求,获取请求参数,并且

nginx+tomcat集群+redis(memcache)session共享!

nginx+tomcat+redissession共享 常用保持session的方式: 1.一些代理(比如nginxIP_hash) 1.使用数据库来存储Session 2.使用Cookie来存储Session                       3.使用Redis来存储Sesssion(memcache也可以) --   环境: 192.168.1.220   nginx    centos6.6   端口:80 版本:1.9.2 192.168.1.224   tomcatA  ce

Nginx 负载均衡条件下 Redis 共享Session (Java)(二)

关于Session的问题 网上有各个方面的针对,有在nginx 上处理: ip_hash的session,有在 tomcat 做处理:修改Context文件,有针对项目做处理.本篇就是对项目处理 1.首先我的项目是用Maven(如果没有用maven可以去下载),使用到的jar包有下: <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifa

用memcache做session共享

测试的前题: 在WEB负载均衡状态下,当用户在WEB1服务器登陆,下次在进行任意操作时,可能会在WEB2,WEB3...中进行请求的处理,因此,在非WEB1的服务器中是不会有SESSION的,到此,需要用到SESSION共享存储来解决该问题. 将session以memcache扩展库进行存储数据 <?php  //首先用memcache的扩展session存储器进行设置 ini_set('session.save_handler', 'memcache'); //session的处理方式为:me