因为Http的无接连,无状态,所以造就了Cookie,Session的诞生。可以看我的上篇WebApp之Cookie原理。
Session也是类似Cookie一样的功能,用于记录客户端浏览器与服务器端交互的会话状态。它与Cookie的重要区别是:
1.Cookie是记录在客户端浏览器本地;(它是不可靠的,客户端浏览器可以不允许服务器记录,还可以删除。)
2.Session是记录在服务器端的
那么Session是如何记录的?
当用浏览器访问服务器的一个请求时,如果要用到Session,服务器会为浏览器窗口开辟一块独一无二的session内存,当其它浏览器窗口再次访问服务器也想用Session时,服务器会为新的浏览器或窗口开辟一块的新的内存。
那有个问题,比如当我第一个页面登陆以后,跳到第二个页面,服务器怎么就知道我是哪个浏览器,怎么知道我属于哪块Session内存呢?而是非常准确地定位到我第一次登陆时创建的那个Sesion,不是其它Session呢?其实这里有一个常用的方法解决这个问题,那就是标记——浏览器第一次来创建Session时,服务器创建一个独一无二的号码标记,标识这个浏览器窗口和这块Session内存是一对一的关系,并将这个标识存储在浏览器窗口中,同时也存储在对应的Session中,当浏览器窗口下次再来的时候把这个标识带过来,服务器就知道根据那个标识去定位Sesssion块了,这个标识就是sessionId,每个浏览器窗口都有一个独一无二的编号SessionId。
那么就有个问题,SessionId存储在什么地方?假设Session已经存在,当浏览器访问过来,它应该要把SessionId带过来,因为只有这样,服务器才知道根据这个SessionId去定位内存中的哪个Session。所以这样一来,就有了两种创建Session的方式:
1.通过Cookie,将SessionId存储在Cookie中
2.通过URL重写,将SessionId作为参数传递
先说第一种,存储在Cookie中有两种方法,可参考我的上篇WebApp之Cookie原理,即浏览器内存和本地文件。哪种存法比较好呢,显然是内存中,因为服务器端Session内存与浏览器窗口一一对应,浏览器窗口存在,SessionId就存在,浏览器窗口关闭了,SessionId留着就没意义了,新开一个浏览器窗口,SessionId就变了。因此通过Cookie创建Session是将SessionId存储在浏览器内存的Cookie中。这样浏览器每次访问服务器,服务器就可以取到SessionId了。
那浏览器可以禁止服务器写入Cookie,当浏览器Cookie被禁止了以后,服务器根本无法写入SessionId,那Session就创建不了,也就用不了啦。所以就有了第二种方法:URL重写。
第二种方法URL重写实现Session:
response.encodeURL(String url);
这个方法有两个作用:
1.转码,当有中文时可以用它来编码,防止乱码。
2.给URL后面加上SessionId
测试时,我们可以将浏览器Cookie关闭,并将跳转到Session的URL地址用encodeURL()包起来。这时再访问就会发现,地址栏请求的URL后跟有参数jessionid。
其实这种方式并不常用,如果要将一个网站的每个要访问Session的URL都这样包起来挺费劲的。只有少数大公司,写代码比较规范,严谨的公司才这么干,大部分公司都不会这么写,因为他们认为,你就应该开启Cookie,如果不开,那么你就用了Session,也就用不了他们服务,产品,像新浪,搜狐这样的大公司都这样。其实我们平时在公司做项目也从来不这样写,但那是因为我们不知道这个原理,至少我是到现在才知道的。现在知道了,也不会那样写,呵呵。
下面以Java代码为例说明创建Session的方法:
HttpSessioin mySession= request.getSession(true);
//这里的参数为true说明:如果窗口对应的Session已经有了,直接拿来用,不创建新的。如果窗口对应的Session没有,则创建一个新。反之参数为false的话:如果窗口对应的Session已经有了,直接拿来用,不创建新的。如果窗口对应的Session没有,也不创建新的。
mySession.isNew();//看Session是不是新创建的
mySession.getId();//得到SessionId即Cookie中存的Id
mySession.getCreationTime();//创建时间
mySession.getLastAccessTime();//最后一次访问Session 的时间,这个用于处理Session自动失效,后面说。
request.getRequestedSessionId();//request也可以取得sessionId
request.isRequestedSessionIdFromCookie();//sessionId是否来自Cookie
request.isRequestedSessionIdFromURL();//sessionId是否来自URL重写
Session的过期:
我们知道Http是无连接的,浏览器请求服务器一个页面后,连接就断掉了。我们经常会发现登陆一个系统以后,很长时间不操作它,不去用它,过了些时间再用,它会提示我们重新登陆,这就是Session过期的原因。
因为服务器不知道客户端浏览器还有没有在访问,可能客户端关机,断电了断网了等。但它服务器不知道,它没有必要为每个浏览器窗口一直保持Session内存不变,这消耗太大了,所以HttpSession有个过期设置,在tomcat的公共web.xml中有
<session-config>
<session-timeout>30</session-timeout>
</session-config>
Session超时设置,30单位为分钟,根据客户端浏览器最后一次访问服务器Session的时间算起超过个时间,服务器自动销毁Session,清除内存。这个时间我们自己可以改,把它拷到我们项目的web.xml重新设置时间可以了。
Session的访问,只要是在一个WebApp下创建的Session,同一个WebApp下随便那个路径下都可以得到,不像Cookie一样有路径的问题,它没有。
总结一下Session的规则:
1.如果浏览器支持Cookie,创建Session时,会将sessionId存储于浏览器内存的Cookie中
2.如果浏览器不支持Cookie,必须自己编程,使用URL重写的方式来实现Session:
response.encodeURL();
3.Session会过期,可以自己设置过期时间
4.Session的访问没有路径问题,同一个WebApp下都可以访问得到。
相关推荐
**PHP的Session基础** 在Web开发中,PHP的Session机制是一种非常重要的用户状态管理工具,它允许开发者在用户的浏览器会话之间存储数据,确保在不同页面间传递信息。本篇文章将深入探讨Session的工作原理以及其在...
实验"session实验"可能涵盖了以下几个关键知识点: 1. **Session的创建与销毁**:实验可能涉及到如何在服务器端创建一个新的Session,以及在用户登出或会话超时时如何销毁Session。通常,开发者会设置一个会话超时...
在PHP编程中,Session是一种非常重要的机制,用于在用户的不同页面请求之间存储和检索数据。一个良好的Session操作类可以极大地提升代码的可...使用这样的类,开发者可以更专注于业务逻辑,而不是基础的Session操作。
1. **Session 基础**: - Session是一种在服务器端存储用户数据的方法,不同于Cookie存储在客户端。 - PHP中的`session_start()`函数用于开启一个会话,允许访问和设置Session变量。 - 通过`$_SESSION`全局数组,...
分布式session简介和 spring session 源码 解析 适合想了解分布式 session的基础知识,想从源码层面了解spring session的同学
这个"oracle基础知识考试题_答案.zip"压缩包文件包含了关于Oracle数据库的基础知识学习材料,特别是针对初学者或者准备Oracle相关资格考试的人员。 首先,Oracle数据库的核心概念包括SQL(结构化查询语言)的使用,...
8. **学习资源**:深入理解ASP.NET的Session管理机制,包括配置、生命周期和性能优化,以及ASP的基础知识,对于实现这种跨平台共享至关重要。可以通过官方文档、教程和社区论坛(如Stack Overflow)获取更多帮助。 ...
本小demo以JSP为基础,旨在帮助初学者理解并掌握Session的使用方法。 首先,我们来解释一下什么是Session。Session是服务器端存储的一个数据结构,用于保存用户特定的信息,比如用户的登录状态、购物车内容等。当...
本篇文章将深入探讨Tomcat集群中session共享的解决方案,以及相关的应用知识。 1. **Session复制**:这是最基础的session共享方法。通过配置Tomcat的`cluster`模块,可以设置session复制策略。每当一个session在...
**JSP实验-购物车(用session实现)...虽然这里没有涉及复杂的框架和技术,但它是理解Web开发中会话管理和状态保持的基础。随着经验的积累,可以进一步学习Spring MVC或Struts等框架,以实现更高效和可维护的购物车系统。
【JSP基础知识填空练习】 1. JSP全称为JavaServer Pages,是由Sun Microsystems公司倡导,多家公司共同参与建立的一种动态网页技术标准。它允许Web开发者在HTML或XML文档中嵌入Java代码,以实现服务器端的动态内容...
通过本篇文档,读者应该能够获得构建基于Nginx+Tomcat+MSM的集群Session共享环境的知识,并能应用这些知识进行实际操作和测试。需要注意的是,在实际操作中,环境配置细节会根据具体需求和软件版本有所不同,因此在...
在学习JSP时,掌握其基础知识点至关重要。以下是对JSP基础的详细解释: 1. 访问JSP页面的URL:在Web服务目录下,如`helloapp/hello.jsp`,要访问该页面,我们需要使用HTTP协议,加上服务器的IP地址或域名以及端口号...
10、Servlet中的forward和redirect有什么区别: ...4)Session(会话对象) 5)Application(应用程序对象) 6)Out(输出对象) 7)Config(配置对象) 8)Page(页面对象) 9)Exception(异常对象)
【标题】"chexagon/redis-session-manager" 是一个针对Java Web应用的session管理解决方案,它主要用于在基于JDK 8...理解并掌握这些知识点,可以帮助开发者成功地将Redis整合进Tomcat,实现高效且可靠的session管理。
本文将围绕“tomcat-redis-session-manager-master.zip”这个压缩包中的源码,深入探讨如何使用Redis实现Tomcat的session共享,并提供详尽的知识点解析。 首先,我们要理解Tomcat的session管理基础。在默认情况下,...
首先,了解HTTP协议的基础知识是非常重要的。HTTP协议是无状态的,这意味着每次请求之间没有任何关联。为了保持用户的登录状态,服务器通常会使用Cookie或Session机制。Cookie是由服务器发送到浏览器的一小块数据,...