最近在做登录和权限控制模块,用到了session,发现session的好多方法都不熟悉,而且以前也听说过JsessionId 之类session窃取的事,对这些一直都是一知半解。今天索性google了很多资料,先上sun的官网去看session的文档了解一些方法,又找了别人关于session的看法。
总结如下:
1,session是什么? what
session经常译为会话,以打电话为例,从开始拨号到挂断电话就是你会话的生存周期。
2,session 做什么用的 why?
首先举个例子:
咖啡店举行 消费满5杯咖啡赠送一杯的活动,可每个人一次消费5杯的时候非常少。这时候有3种办法:
1,店员看到每个顾客时都能记住其消费了多少杯,从而给其优惠,这是协议本身具有状态
2,给每个顾客一个卡片,上面记录顾客的每次消费,这是客户端保存状态
3,给每个顾客一个卡片,卡片上只有一个编号,顾客每次的消费记录在店里,这就是 服务端有状态
而http本身是无状态的,所以我们只能使用2,3中方法,来保存一些信息。
实际采用的是第3种方法,服务器段保存一次会话所有的信息,并生成一个唯一的id,这个id没有规律而且不会重复,将这个id传回到客户段,保存到cookie中。每次访问服务器时,客户端都会偷偷将这个id传到服务器,服务器根据id查到这次会话保存的内容。就能实现会话中共享一些数据。
3,session怎样创建和销毁 ? how
session是保存在内存中的,所以会有一些性能上的影响。因此本着这个原则,session是只有在使用到的时候才会被创建,如果始终没有用到session,这个session是永远不会被创建的。
比如: 访问servlet ,只要你代码中没有 request.getSession()或request.getSession(true);这两行是等价的,那session是不会创建。又 当你访问静态页面时,根本不会生成servlet,所以也不会创建session。
下面解释一些疑惑: session是第一次请求时创建的?
大家都知道 jsp是被编译成servlet才执行的,问题就在jsp编译的过程。
jsp中有个<%@ page session="true/false"%> 这个开关表示是否创建session,当你不写这行时,它会默认给你加上这句。所以会造成上面的疑惑。当然还有一些标签中可能有getSession()操作,会产生一些不必要的session。
session只能在服务端销毁,有三种途径: 1,到达session的最大请求间隔时间时,2,session。invalidate()
3,服务器进程当掉。
这里也有一些疑惑: 浏览器关闭时,session就会注销。
首先浏览器关闭时,浏览器并没有给服务器发送任何消息,所以服务器不会知道浏览器何时关闭了。
上面我们知道取得session 是因为浏览器cookie中有sessionid,而普通cookie通常会是会话cookie,也就是说浏览器关闭时,这个cookie会被注销,所以当你再访问服务器时就没有sessionid了,所以造成session关闭了的假象,如果昵称通过特殊方法将sessionid传递给服务器,你会发现session还在。
如果想让cookie保存时间长一些,就需要手动指定cookie的过期时间
4,实际项目中的难点:
1,浏览器禁用cookie
这就没办法保存sessionid了,可以采用url重写,转发,加隐藏字段等方法来将sessionid传给服务器。
如: baidu.com:jsessionid=adfasdfasdfasdfasdfafdadf?asdfasdf
baidu.com?jsessionid=asdfasdfasdfadsfad&&adfdf
这根据服务器的不同实现,第一种可以将普通参数区分开。
2,多人共用session的问题
例: a 访问 baidu.com ,但他没有帐号,于是他将连接 baidu.com/login.jsp?jsessionid=adsfasdfad(这个a的sessionid) 发给B, B登录后,a就相当于用b的帐号登录了。你们可以在在本地试试。
解决方法: 当发现通过sessionid从url指定时, 创建一个新的session,将旧session的信息复制到 新sessoin中,然后将新session注销。就能防止上面那种情况了。
3,一个帐号多地方登录
比如: 你用abc帐号登录了baidu.com,有打开了一个浏览器,又用abc帐号登录了一次。当不设计敏感操作时,这无所谓,而当你做一些敏感操作时就必须禁止这样情况,防止同时操作,造成重复操作,或者数据损坏。
解决方法: 监听session,将username和sessionid对应起来,当username再次登录时,注销掉以前的session,保存现在的session,这也是一种比较不错的方案。
分享到:
相关推荐
下面是关于Springboot实现多服务器session共享的详细知识点: Session共享的原理 在正常情况下,HTTPSession是通过servlet容器创建并管理的,创建成功后都保存在内存中。如果开发者需要对项目进行横向拓展搭建...
在配置文件中指定存储引擎和连接参数,即可实现SESSION数据的跨服务器共享。 另外,还可以利用HTTP cookie来存储部分SESSION信息,如SESSION ID,然后通过网络调用中央存储服务来获取完整的SESSION数据。这种方法...
3. **共享数据库或缓存**:将Session数据存储在一个中央数据库或者如Redis、Memcached这样的分布式缓存系统中。每个域都可以访问这个共享存储来读写Session数据。这种方式灵活且可扩展性好,但需要处理数据同步和...
7. **Shiro-Redis**:Shiro-Redis2.9是Shiro的一个扩展,它将session数据存储在Redis缓存中,解决了在分布式环境下的session共享问题。Redis是一个高性能的键值数据库,具有丰富的数据结构支持,适合存储session这样...
标题中的“nginx实现多个tomcat7直接...以上就是关于“nginx实现多个tomcat7直接session共享所需jar包”的详细解释,包括了Session共享的背景、原理以及可能的实现方法。希望这些信息能帮助你理解和解决实际问题。
1. **共享内存(SharedMemory)**:在所有Tomcat实例之间共享一块内存区域来存储Session数据。这种方法效率最高,但需要所有的服务器在同一台机器上,且有较高的系统资源需求。 2. **数据库(JDBC)**:利用数据库...
在分布式系统中,由于用户请求可能会被路由到不同的服务器上,因此,如何在多台服务器之间共享session数据成为了一个挑战。这就是“用redis共享session”这个主题所关注的核心问题。 Redis是一个高性能的键值数据库...
在集群环境中,传统的Session管理方式往往难以实现数据同步,因为每个服务器都有自己的内存中Session,无法共享。而采用Redis作为Session存储,可以通过以下步骤实现共享: 1. **配置Redis服务器**:在集群中部署并...
"PHP实现多服务器session共享之memcache共享"的主题着重于如何在多台服务器之间有效地存储和同步用户的session数据,以确保用户在不同服务器间的会话状态能够保持一致。本文将深入探讨这一主题,并围绕相关知识点...
在分布式系统中,Session共享是一个常见的挑战,尤其是在多个服务器或应用之间需要保持用户状态时。本文将深入探讨一种实现方式——使用Tomcat8与Redis相结合的Session共享方案。该方案旨在确保用户在集群中的任意一...
Spring Session + Redis的结合提供了一个高效且可靠的解决方案,它允许跨服务器节点透明地共享session数据。本文将深入探讨如何利用Spring Session与Redis来实现这一功能。 首先,Spring Session是一个开源项目,由...
标题中的“tomcat8+memcached session共享”...其他实例在接收到同一用户的请求时,可以从Memcached中获取session数据,从而实现session的跨服务器共享。这种解决方案可以有效提升大型分布式系统的可扩展性和用户体验。
SSM+Redis 实现Session共享是现代Web应用中常见的技术组合,主要目的是在分布式系统中保持用户Session的一致性。SSM是指Spring、Spring MVC和MyBatis这三大Java Web开发框架的组合,而Redis则是一种高性能的键值存储...
在传统的Web应用中,Session信息通常存储在单个服务器的内存中,当应用部署在集群或者分布式环境时,不同服务器之间无法共享Session数据,导致用户在切换服务器时会丢失Session信息。Spring Session的出现,就是为了...
然而,当涉及到多个子域时,标准的Session机制并不支持数据的共享。在跨子域网站间共享Session,是为了提供统一的用户体验,例如在电子商务网站中,用户在购物车(cart.example.com)添加商品后,希望在结账...
标题“shiro redis session共享”涉及的是Web应用中关于用户会话管理的技术,主要集中在Apache Shiro框架和Redis缓存系统上。Apache Shiro是一款强大的Java安全框架,它提供了身份验证、授权、加密和会话管理功能。...
标题中的“跨域共享session”是指在Web开发中,如何在不同的域名或协议(如HTTP和HTTPS)之间共享用户登录状态。...实现HTTP到HTTPS的session共享需要综合考虑这些因素,并确保在提供便利的同时,保证用户数据的安全。
Redis作为一种高效、可持久化的键值存储系统,常被用作Session的集中式存储,以实现多服务器间的Session共享。本项目“redissession共享代码”提供了一个简单的实例,帮助开发者理解如何利用Redis来实现Session共享...
这样,所有服务器都可以通过访问同一Redis实例获取到用户的session信息,实现session的共享。 3. **Nginx配置负载均衡** Nginx通过配置upstream模块,可以将来自客户端的请求分发到不同的后端服务器。常见的负载...