由于业务需要,昨天稍微研究了一下tomcat处理session的机制,对此有了更为深刻的理解,现在记下来,供大家参考和讨论。
大家也许都了解,tomcat为了维持和浏览器之间的session对应关系,主要采用三种方式:
1.cookie纪录sessionId;
2.url重写;
3.隐藏表单,这个几乎和url重写意义相同;
之前,我一直非常相信浏览器的cookie,即便浏览器端关闭了cookie,也相信tomcat会自动帮忙重写url,但是进入到wap这行后,cookie就不敢那么恭维了;
有些手机浏览器就只能保持一个cookie,并且对于cookie的维护性极差到一定地步,例如在“/”根目录下的sessionId存储与路径为“/”的cookie中,而遇到“/a/”的情况,由于手机浏览器只能保持一个cookie,它居然愚蠢到将这个cookie里的sesionid等同于“/”中的sessionid,就不再纪录了,也就是说“/a/”中的sessionid强制和“/”中的一样,并且每次访问“/a/”中的sessionid和“/”的一样;
大家都知道,对于很多时候“/”和“/a/”的目标路径,几乎不在同一个服务,甚至不在同一台服务器上,这点令我很是郁闷。
为了这个,我为每个链接的后面就加上了sessionid,这样居然还是不行,后来我查看了许多tomcat相关的文档,在配置文件的context中有个cookies选项,如果配置为false,则不信任浏览器的cookie,只信任url后面的jsessionid,但是公司的服务很大很杂,如果我更改了这个选项,怕影响到其它服务,最妥协的办法就是让tomcat先选择url后面的sessionid,如果没有再去cookie中去找,但是我没有发现这样的配置选项;
于是乎我查看起了tomcat的源代码,后来发现CoyoteAdapter类中对于sessionid的处理是这样的,显示运行parseSessionId(req,
request),这个方法是在url中获取sessionid作为requestedSessionId,在同一方法的最后运行parseSessionCookiesId(req,
request),这个方法负责在cookie中获取sessionid,这个方法之前会判断,如果配置中禁止cookie,则不取cookie中的了,也就是说无法优先选择url中的sessionid,只能选择或不选择cookie的:(
这样对于复写tomcat代码的梦想也几乎覆灭了,于是只能执行强加手段了。
由于cookie中的sessionid是通过协议的head头传给服务器的,于是在apache中,强制改写head头,使“/”目录下的sessionid在访问"/a/"的时候强制实效,才解决了这个问题。
纵观事件,难道我们就只能采取妥协的或者强制的方法才能解决一些郁闷的问题吗?呵呵(苦笑ing)
不知道大家有没有好的办法解决cookie和session的问题,有多少辛酸,大家都说说吧
分享到:
相关推荐
TOMCAT中SESSION与COOKIE的深度探索.pdf
tomcat修改sessionId,同一台服务器部署多个tomcat需要修改sessionId,否则会出现session冲突的问题
### 设定Tomcat中Session过期时间的三种方式 在Web开发中,Session管理是确保用户状态跟踪的重要机制之一。Tomcat作为一款广泛使用的Java应用服务器及Servlet容器,提供了多种方式来设定Session的有效时长。这有助...
在Tomcat 5.x 版本中,可以通过设置系统属性 `org.apache.catalina.SESSION_COOKIE_NAME` 来更改JSessionID在Cookie中的名称。具体操作步骤如下: 1. **Linux环境:** ```bash JAVA_OPTS="-Dorg.apache.catalina....
【标题】:“Tomcat Redis Session”指的是在Tomcat集群环境中,通过Redis来实现Session的共享与同步,以解决集群中的Session一致性问题。 【描述】:“Tomcat集群Nginx使用Redis保证Session同步”这一场景中,通常...
2. 具有容错功能,及时把 Session 备份到 Session Store 中,当 Tomcat 服务器意外关闭后再重启时,可以从 Session Store 中恢复 Session 对象; 3. 可以灵活控制在内存中的 Session 数目,将部分 Session 转移到 ...
在Tomcat中集成memcached作为Session管理器,可以将Session数据分布在网络中的多个节点上,实现Session复制和高可用性。 为了在Tomcat中使用memcached进行Session管理,你需要以下关键的依赖jar包: 1. **...
在构建分布式系统时,Session共享是一个关键问题,特别是在使用Linux上的Tomcat服务器集群与Nginx作为反向代理的情况。标题“tomcat-session共享”和描述中提到的问题,主要是指如何在多台Tomcat服务器之间以及通过...
在`Tomcat`中,我们可以通过`Tomcat Redis Session Manager`来实现与Redis的集成。这个组件允许我们将Tomcat的session数据存储在Redis中,使得所有服务器都能访问到这些数据。在提供的压缩包文件中,`jedis-2.1.0....
然而,当多个Tomcat实例组成一个集群时,session(用户会话)共享成为一个挑战,因为每个实例都有自己的内存空间,无法直接访问其他实例中的session数据。本篇文章将深入探讨Tomcat集群中session共享的解决方案,...
标题 "Tomcat7+Redis+Session 负载之后session 共享 tomcat jar包" 涉及的是在使用Nginx做负载均衡时,如何通过集成Redis来实现Tomcat7服务器之间的Session共享,从而确保用户在不同服务器之间切换时仍然能够保持...
这些JAR包将集成到Tomcat的运行环境中,使Tomcat能够与Memcached通信并处理session的存储和检索。 以下是这些JAR包的作用: 1. `spymemcached-2.8.4.jar`:这是一个基于Java的Memcached客户端库,用于连接和操作...
以下是实现Tomcat集群session共享与Redis结合的步骤和知识点: 1. **配置Redis服务器**:首先,你需要安装并运行一个Redis实例。确保其稳定运行,并且能够被集群中的所有Tomcat服务器访问。 2. **选择session复制...
【Tomcat5 Session 复制详解】 在分布式环境中,保持用户会话(Session)的一致性是至关重要的。Tomcat5 提供了集群(Cluster)功能来实现 Session 的复制,确保用户在不同服务器间的会话状态能够无缝切换。以下是...
4. **启动和测试**:重启Tomcat服务器,然后通过访问应用程序并进行登录操作,观察Redis中是否成功存储了Session数据。可以通过Redis客户端工具进行检查。 这个解决方案的优势在于,当你的Web应用部署在多台Tomcat...
2. **安装Redis-Session-Manager**: 在`Tomcat7`中,我们需要一个能够与Redis通信的Session管理器。可以通过`Spring Session`或者`JedisSessionRepositoryFilter`来实现。这里以`JedisSessionRepositoryFilter`为例...
【标题】"tomcat-redis-session-manager包集合下载(tomcat8)"涉及的主要知识点是将Redis集成到Tomcat中管理会话(session),以提高Web应用的性能和可扩展性。 【描述】中提到的"所需的tomcat-redis-session-...
标题中的"redis+tomcat实现session的jar"指的是在Tomcat服务器中利用Redis数据库来实现Web应用程序的会话(session)共享技术。Redis是一个高性能的键值存储系统,常用于缓存和分布式环境下的数据共享。在传统的Web...
标题中的“nginx实现多个tomcat7直接session共享所需jar包”指的是在分布式系统环境中,使用Nginx作为反向代理服务器,将用户请求分发到多个Tomcat7应用服务器上,同时实现用户会话(Session)在这些服务器之间的...
1. **Tomcat Session管理**:Tomcat默认使用基于Cookie的Session跟踪,但在一个集群环境中,这种方法无法有效共享Session信息。因此,需要采用其他策略,如 Sticky Session 或 Session Replication。 2. **Sticky ...