`

Session保持

 
阅读更多

 Session保持

一.Session本质

http协议是无状态的,服务端对于客户端来说是透明的,连续访问某个网页100次和访问1次对服务器来说是没有区别对待的,因为它记不住你。
 但是,在一些场合,确实需要服务器记住当前用户怎么办?比如用户登录邮箱后,接下来要收邮件、写邮件,总不能每次操作都让用户输入用户名和密码吧,为了解决这个问题,session的方案就被提了出来,事实上它并不是什么新技术,而且也不能脱离http协议以及任何现有的web技术。

 

二.关于Session共享

首先,单机环境不存在session共享的问题,但是无法保证高可用,但是如果你使用了负载均衡把请求分发到不同的机器呢?这个时候会话id在客户端是没有问题的,但是如果用户的两次请求到了两台不同的机器,而它的session数据可能存在其中一台机器,这个时候就会出现取不到session数据的情况,于是session的共享就成了一个问题。

 

三.Session共享解决方案

1.采用Nginx负载均衡器,采用的ip_hash来代替默认的轮询方式,即可以将某客户端IP的请求通过哈希算法定位到同一台后端web服务器上,这样避免了session丢失,解决了session问题。
ip_hash指令无法保证后端服务器的负载均衡,可能有些后端服务器接收的请求多,有些后端服务器接收的请求少;这样失去了负载均衡的意义。

 

2.将用户的登录session信息写进后端的Mysql数据库,这个在后面的CMS系统中也实现了,效果也不错;但是,用数据库来同步session,会加大数据库的IO,增加数据库的负担。而且数据库读写速度较慢,不利于session的适时同步,不推荐。
后来我提出了折衷方案,如果Nginx并发连接数(即Nginx负载均衡器的NginxStatus的 active connections)>2000,即采用将session写进MySQL数据库的方法;如果并发数小的话,ip_hash效果也是相当好的。
可参考:http://blog.csdn.net/donggang1992/article/details/51095551

 

3.Session复制,适用于接入层集群较少时,因为session复制占用服务器资源,存储占内存

例如:可以将session缓存到redis中,达到session复制的目的。目前此种方案是 nginx + redis + tomcat 实现的

4.Session绑定,主从复制   ************【ip_hsah 未尝试主从复制】**************

 

5.客户端cookie保存Session


6.Session集群

 

 

一.使用 filter 方法存储(未实现

这种方法比较推荐,因为它的服务器使用范围比较多,不仅限于 tomcat ,而且实现的原理比较简单容易控制。
可以使用 memcached-session-filter
官方网址:http://code.google.com/p/memcached-session-filter/
官方介绍:解决集群环境下java web容器session共享,使用filter拦截器和memcached实现。在tomcat 6和websphere 8测试通过,现网并发2000,日PV量1100万。
暂不支持session event包括create destory 和 attribute change
东西很不错,体积很小,不过这个东东要和 spring 一起使用,而且要求存储到 memcached 的对象要实现 java 的序列化接口
大家也知道,java 本身的序列化性能也很一般。
我将其简单扩展了一下,不再依赖 spring ,并且利用 javolution 实现序列化,缓存的对象不再有限制。
暂时没有发现 redis 的实现,后面将自己实现使用 redis 存储并且序列化使用 kyro ,详细情况有时间再单独写出来。

 

二.基于Tomcat本身的session集群共享未实现

问题:配置完成,但是无效

参考的是:tomcat session共享;

 

 

三.使用 tomcat session manager 方法存储

这种方法服务器只能使用 tomcat ,但网上有针对 memcached 和 redis 实现,直接配置就行了。 针对Redis,已实践

1.环境准备

Tomcat集群

IP 主机名 端口号
192.168.1.111 edu-web-01 8081
192.168.1.112 edu-web-02 8081

 

Redis集群

通过TWEMPROXY构建的Redis集群

192.168.1.122 edu-redis-01 6660/6661
192.168.1.123 edu-redis-02 6661
192.168.1.124 edu-redis-03 6661

 

相关命令:(含配置文件地址)

 

需要在192.168.1.122,123,124 上分别启动:
SSDB 7770 7771 8880 8881
nohup /usr/local/ssdb/ssdb-server   /usr/local/ssdb-master/ssdb_basic_7770.conf &  
nohup /usr/local/ssdb/ssdb-server   /usr/local/ssdb-master/ssdb_basic_7771.conf &  
nohup /usr/local/ssdb/ssdb-server   /usr/local/ssdb-master/ssdb_desc_8880.conf  &  
nohup /usr/local/ssdb/ssdb-server   /usr/local/ssdb-master/ssdb_desc_8880.conf  &  

REDIS 
192.168.1.122:6660 6661
/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis_6660.conf &
/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis_6661.conf &
192.168.1.123 6661
/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis_6661.conf &
192.168.1.124 6661
/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis_6661.conf &

启动Twemproxy
nutcracker.init {start|stop|status|restart|reload|condrestart}
nutcracker -d -c /usr/local/twemproxy/conf/nutcracker.yml -p /usr/local/twemproxy/run/redisproxy.pid -o /usr/local/twemproxy/run/redisproxy.log

 

 

测试:

 

redis-cli -h 192.168.1.122 -p 1115

 

2.配置Tomcat

2.1 新增jar包,将这3个jar包放到Tomcat的lib目录下

tomcat-redis-session-manager-1.2-tomcat-7.jar
jedis-2.1.0.jar
commons-pool-1.6.jar

 

2.2设置Tomcat配置文件

修改 context.xml 文件,在<context></context>内新增

<Context>

    <!-- Default set of monitored resources -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>

    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
    <Manager pathname="" />
    -->

    <!-- Uncomment this to enable Comet connection tacking (provides events
         on session expiration as well as webapp lifecycle) -->
    <!--
    <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />
    -->

	<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve"/>
	<Manager className="com.radiadesign.catalina.session.RedisSessionManager" database="0" host="192.168.1.122" maxInactiveInterval="60" port="1115"/>
</Context>

 

 注:我在server.xml配置时出现问题,同时在<context>内配置一开始也没成功,原因未查

 

2.3  运行测试环境

将WEB项目分别添加到2个Tomcat中并启动。
在test1应用的index.jsp中增加如下代码
<%
session.setAttribute("shareSession", "redis share Session")
%>
<a href="/test2">test2 index.jsp</a>
在test2应用的index.jsp中增加如下代码
<%=session.getAttribute("shareSession")%>(输出为NULL)
分别访问Tomcat1和Tomcat2,发现两边浏览器的jsessionid是一样的,在Redis控制台运行key *打印出来的就是共享的jsessionid

 

参考的是:基于Redis缓存的Session共享测试

 

此外,还可以使用memcache,未实践

1、修改 tomcat 的 conf 目录下的 context.xml 文件:
  <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"    memcachedNodes="n1:localhost:11211 n2:localhost:11212"     failoverNodes="n2"   
  requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$"     sessionBackupAsync="false"      sessionBackupTimeout="100"      transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"     copyCollectionsForSerialization="false"    />;

2、以上是以 1.3 版为例子,需要用的 jar 包:
memcached-session-manager-1.3.0.jar
msm-javolution-serializer-1.3.0.jar
javolution-5.4.3.1.jar
memcached-2.4.2.jar

 

 

 

四.基于terracotta 服务器共享

 

 参考:http://www.cnblogs.com/interdrp/p/4056525.html 待实现

 



分享到:
评论

相关推荐

    使用session保持登陆状态

    "使用session保持登陆状态"这个主题就是关于如何在用户成功登录后,通过服务器端的session技术来维持其在线状态,直到用户主动退出或者session过期。下面我们将深入探讨这个话题。 首先,我们了解什么是session。...

    彻底解决android用HttpUrlConnection与web服务器之间session保持问题

    总之,解决Android与Web服务器之间的session保持问题,关键是理解Cookie和Session的工作原理,以及在Android中如何正确处理它们。通过手动设置请求头中的Cookie,或者使用支持自动处理Cookie的库,可以有效地实现...

    Tomcat基于memcached的session保持-nginx反代

    ### Tomcat 基于 Memcached 的 Session 保持与 Nginx 反向代理实现 在分布式系统中,为了提高应用的可用性和扩展性,通常会采用多台服务器集群部署的方式来提供服务。对于 Java Web 应用而言,Tomcat 是一个常见的...

    Java 使用HttpClient保持SESSION状态

    在处理Web应用程序时,有时我们需要保持用户的登录状态,即SESSION状态。这通常涉及到Cookie管理,因为服务器通过Cookie来跟踪客户端的会话。下面我们将详细探讨如何在Java中使用HttpClient来实现这一目标。 首先,...

    WebRequest保持Session的方法

    在Web应用程序中,Session通常用来在客户端和服务器之间保持状态。当用户登录后,服务器会为该用户创建一个Session,通过SessionID来识别用户。但是,使用`WebRequest`进行多条HTTP请求时,如果不采取特殊措施,...

    android实现session保持简要概述及实现

    以下是关于在Android中实现Session保持的详细解释和步骤。 1. **理解Session机制**: Session是一种服务器端存储用户状态的技术。当用户登录Web应用后,服务器会创建一个Session,并将用户的登录信息存储在该...

    .net 和IIS7.5关于Session超时的设置

    这里的`timeout`属性定义了Session保持活跃状态的分钟数。在这个例子中,Session将在60分钟后自动过期。请注意,`mode`属性指定了Session状态管理的模式,`InProc`表示Session数据存储在同一个应用程序实例的内存中...

    session实现记录用户登录状态

    用session记录用户的登录状态 1.登录 2.登录成功后将此“已登录”状态保存。 3.实现“显示员工列表”功能。 4.当用户点击“显示员工列表”的时候,验证用户是否已登录,已登录继续显示员工列表,没有登录则跳转到...

    在JAX-WS 中实现多个WebService间会话保持

    在JAX-WS中实现会话保持涉及到服务器端的session获取与管理,以及客户端在请求中携带session ID的能力。通过使用`WebServiceContext`和`MessageContext`,服务端可以获取并操作session。客户端则需要配置`...

    Session

    例如,在线教育平台如何利用Session保持用户的学习进度,或者在线购物网站如何利用Session跟踪用户的购物行为。 总的来说,Session是Web开发中不可或缺的一部分,它确保了用户在不同请求之间的状态一致性,而理解...

    java后台请求http并保持Session

    在Java编程中,后台请求HTTP并保持Session是一个常见的任务,特别是在需要访问受保护的Web资源时,例如登录后的网页数据。下面将详细讲解这个过程,...同时,注意保持良好的安全性,避免Session劫持或Session固定攻击。

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

    4. 配置Nginx:在Nginx的配置文件中,设置负载均衡策略,例如轮询或者基于IP的哈希策略,这样可以确保用户在集群中的session保持一致性。 5. 测试与优化:部署应用并进行测试,确保session在不同Tomcat节点间能正确...

    httpclient如何保持session会话模拟登录后的操作

    本文将详细讲解如何使用HTTPClient来保持session会话,从而实现模拟登录后的其他操作。 首先,理解session的概念至关重要。Session是服务器端用来跟踪用户状态的一种机制。在Web应用中,当用户登录后,服务器会为该...

    phpcms web发布session过期问题解决

    如果用户希望session保持更长时间,可以通过修改这个值来延长。 解决phpcms session过期问题的方法有以下几种: 1. **延长session生命周期**:在phpcms的配置文件中,找到并修改`session.gc_maxlifetime`参数,将...

    Java中设置session超时(失效)的三种方法

    需要注意的是,`setMaxInactiveInterval`方法设置的是用户在无操作的情况下,Session保持活跃的时间。一旦超过这个时间,再次访问时,Session将被认为是过期的,但服务器并不会立即销毁Session,而是等到服务器清理...

    session共享tomcat7 memcached 文档

    - **Session保持(Sticky Session)**:将同一客户端的所有请求定向到同一台服务器,这样可以避免Session数据的同步问题,但可能会导致服务器负载不均。 - **Session共享**:有两种主要实现方式: - 将所有Session...

    针对负载均衡集群中的session解决方案的总结.docx

    在构建负载均衡集群时,确保用户...例如,小型应用可能更倾向于使用Session保持,而大型电商网站可能需要更复杂的Session共享或数据库存储方案。在设计解决方案时,还需要考虑到故障恢复策略、性能优化和安全性等因素。

    session session session szsessdifn

    为了克服Session的一些缺点,可以考虑使用Cookie(但Cookie大小和数量有限制)、Viewstate(适合在同一页内保持状态)、Application(全局共享数据,不随用户变化)或者数据库存储(适合大量持久化数据)等替代方案...

Global site tag (gtag.js) - Google Analytics