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。
此外,还可以使用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。...
总之,解决Android与Web服务器之间的session保持问题,关键是理解Cookie和Session的工作原理,以及在Android中如何正确处理它们。通过手动设置请求头中的Cookie,或者使用支持自动处理Cookie的库,可以有效地实现...
### Tomcat 基于 Memcached 的 Session 保持与 Nginx 反向代理实现 在分布式系统中,为了提高应用的可用性和扩展性,通常会采用多台服务器集群部署的方式来提供服务。对于 Java Web 应用而言,Tomcat 是一个常见的...
在处理Web应用程序时,有时我们需要保持用户的登录状态,即SESSION状态。这通常涉及到Cookie管理,因为服务器通过Cookie来跟踪客户端的会话。下面我们将详细探讨如何在Java中使用HttpClient来实现这一目标。 首先,...
在Web应用程序中,Session通常用来在客户端和服务器之间保持状态。当用户登录后,服务器会为该用户创建一个Session,通过SessionID来识别用户。但是,使用`WebRequest`进行多条HTTP请求时,如果不采取特殊措施,...
以下是关于在Android中实现Session保持的详细解释和步骤。 1. **理解Session机制**: Session是一种服务器端存储用户状态的技术。当用户登录Web应用后,服务器会创建一个Session,并将用户的登录信息存储在该...
这里的`timeout`属性定义了Session保持活跃状态的分钟数。在这个例子中,Session将在60分钟后自动过期。请注意,`mode`属性指定了Session状态管理的模式,`InProc`表示Session数据存储在同一个应用程序实例的内存中...
用session记录用户的登录状态 1.登录 2.登录成功后将此“已登录”状态保存。 3.实现“显示员工列表”功能。 4.当用户点击“显示员工列表”的时候,验证用户是否已登录,已登录继续显示员工列表,没有登录则跳转到...
在JAX-WS中实现会话保持涉及到服务器端的session获取与管理,以及客户端在请求中携带session ID的能力。通过使用`WebServiceContext`和`MessageContext`,服务端可以获取并操作session。客户端则需要配置`...
例如,在线教育平台如何利用Session保持用户的学习进度,或者在线购物网站如何利用Session跟踪用户的购物行为。 总的来说,Session是Web开发中不可或缺的一部分,它确保了用户在不同请求之间的状态一致性,而理解...
在Java编程中,后台请求HTTP并保持Session是一个常见的任务,特别是在需要访问受保护的Web资源时,例如登录后的网页数据。下面将详细讲解这个过程,...同时,注意保持良好的安全性,避免Session劫持或Session固定攻击。
4. 配置Nginx:在Nginx的配置文件中,设置负载均衡策略,例如轮询或者基于IP的哈希策略,这样可以确保用户在集群中的session保持一致性。 5. 测试与优化:部署应用并进行测试,确保session在不同Tomcat节点间能正确...
本文将详细讲解如何使用HTTPClient来保持session会话,从而实现模拟登录后的其他操作。 首先,理解session的概念至关重要。Session是服务器端用来跟踪用户状态的一种机制。在Web应用中,当用户登录后,服务器会为该...
如果用户希望session保持更长时间,可以通过修改这个值来延长。 解决phpcms session过期问题的方法有以下几种: 1. **延长session生命周期**:在phpcms的配置文件中,找到并修改`session.gc_maxlifetime`参数,将...
需要注意的是,`setMaxInactiveInterval`方法设置的是用户在无操作的情况下,Session保持活跃的时间。一旦超过这个时间,再次访问时,Session将被认为是过期的,但服务器并不会立即销毁Session,而是等到服务器清理...
- **Session保持(Sticky Session)**:将同一客户端的所有请求定向到同一台服务器,这样可以避免Session数据的同步问题,但可能会导致服务器负载不均。 - **Session共享**:有两种主要实现方式: - 将所有Session...
在构建负载均衡集群时,确保用户...例如,小型应用可能更倾向于使用Session保持,而大型电商网站可能需要更复杂的Session共享或数据库存储方案。在设计解决方案时,还需要考虑到故障恢复策略、性能优化和安全性等因素。
为了克服Session的一些缺点,可以考虑使用Cookie(但Cookie大小和数量有限制)、Viewstate(适合在同一页内保持状态)、Application(全局共享数据,不随用户变化)或者数据库存储(适合大量持久化数据)等替代方案...