1.Session简单介绍
在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。
在这里基于Java Servlet理解Session的概念与原理,在Java中,HTTP的Session对象用javax.servlet.http.HttpSession来表示。
2.Session和Cookie的区别
- Cookie是把用户的数据写给用户的浏览器
- Session是把用户数据写到用户独占的Session中
- Session对象由服务器创建,开发人员可以调用request对象的GetSession方法得到session对象
3.Session实现原理
服务器是如何实现一个session为一个用户浏览器服务的?
第一次访问时,服务器会创建一个新的sesion,并且把session的Id以cookie的形式发送给客户端浏览器。服务器创建session出来后,会把session的id号,以cookie的形式回写给客户机,这样,只要客户机的浏览器不关,再去访问服务器时,都会带着session的id号去,服务器发现客户机浏览器带session id过来了,就会使用内存中与之对应的session为之服务。
4.Session对象的创建与销毁
4.1Session对象的创建
//范例:创建session
//使用request对象的getSession()获取session,如果session不存在则创建一个
HttpSession session = request.getSession();
//获取session的Id
String sessionId = session.getId();
//判断session是不是新创建的
if (session.isNew()) {
response.getWriter().print("session创建成功,session的id是:"+sessionId);
}else {
response.getWriter().print("服务器已经存在session,session的id是:"+sessionId);
}
4.2 Session对象的销毁
1)Session超时:超时指的是连续一定时间服务器没有收到该Session所对应客户端的请求,并且这个时间超过了服务器设置的Session超时的最大时间。
2)程序调用HttpSession.invalidate()
3)服务器关闭或服务停止
session会因为浏览器的关闭而删除吗?
不会,session只会通过上面提到的方式去关闭。
下面为方法1,2:
session对象默认30分钟没有使用,则服务器会自动销毁session,在web.xml文件中可以手工配置session的失效时间,
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 设置Session的有效时间:以分钟为单位-->
<session-config>
<session-timeout>15</session-timeout>
</session-config>
</web-app>
当需要在程序中手动设置Session失效时,可以手工调用session.invalidate方法,摧毁session。
HttpSession session = request.getSession();
//手工调用session.invalidate方法,摧毁session
session.invalidate();
5.Session位置
服务器端的内存中(服务器崩掉所有session就没了)。不过session可以通过特殊的方式做持久化管理(将session放在磁盘中)。
6.session的id是从哪里来的
sessionID是如何使用的:当客户端第一次请求session对象时候,服务器会为客户端创建一个session(session的创建时间, 由于session会消耗内存资源,因此,如果不打算使用session,应该在所有的JSP中关闭它。 ),并将通过特殊算法算出一个session的ID,用来标识该session对象,当浏览器下次(session继续有效时)请求别的资源的时候,浏览器会偷偷地将sessionID放置到请求头中,服务器接收到请求后就得到该请求的sessionID,服务器找到该id的session返还给请求者==(Servlet)==(jsp编译成servlet时插入请求session对象的方法:HttpSession session = HttpServletRequest.getSession(true))会将使用。一个会话只能有一个session对象,对session来说是只认id不认人。
7.session其他问题
- session是一个容器,可以存放会话过程中的任何对象。
- session因为请求(request对象)而产生,同一个会话中多个request共享了一session对象,可以直接从请求中获取到session对象。
- 其实,session的创建和使用总在服务端,而浏览器从来都没得到过session对象。但浏览器可以请求Servlet(jsp也是Servlet)来获取session的信息。客户端浏览器真正紧紧拿到的是session ID,而这个对于浏览器操作的人来说,是不可见的,并且用户也无需关心自己处于哪个会话过程中。