- session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话是从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session。
- session在Web开发环境下的语义又有了新的扩展,它的含义是指一类用来在客户端与服务器端之间保持状态的解决方案。有时候Session也用来指这种解决方案的存储结构。
Session机制
- session机制采用的是在服务器端保持 HTTP 状态信息的方案 。
- 服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。
- 当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否包含了一个session标识(即sessionId),如果已经包含一个sessionId则说明以前已经为此客户创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个,这种情况可能出现在服务端已经删除了该用户对应的session对象,但用户人为地在请求的URL后面附加上一个JSESSION的参数)。如果客户请求不包含sessionId,则为此客户创建一个session并且生成一个与此session相关联的sessionId,这个session id将在本次响应中返回给客户端保存。
保存session id的几种方式
- 保存session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。
- 由于cookie可以被人为的禁用,必须有其它的机制以便在cookie被禁用时仍然能够把session id传递回服务器,经常采用的一种技术叫做URL重写,就是把session id附加在URL路径的后面,附加的方式也有两种,一种是作为URL路径的附加信息,另一种是作为查询字符串附加在URL后面。网络在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id。
Session cookie
- session通过SessionID来区分不同的客户, session是以cookie或URL重写为基础的,默认使用cookie来实现,系统会创造一个名为JSESSIONID的输出cookie,这称之为session cookie,以区别persistent cookies(也就是我们通常所说的cookie),session cookie是存储于浏览器内存中的,并不是写到硬盘上的,通常看不到JSESSIONID,但是当把浏览器的cookie禁止后,web服务器会采用URL重写的方式传递Sessionid,这时地址栏看到
- session cookie针对某一次会话而言,会话结束session cookie也就随着消失了,而persistent cookie只是存在于客户端硬盘上的一段文本。
- 关闭浏览器,只会是浏览器端内存里的session cookie消失,但不会使保存在服务器端的session对象消失,同样也不会使已经保存到硬盘上的持久化cookie消失。
测试代码
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!--
public interface javax.servlet.http HttpSession
提供一种方式,跨多个页面请求或对 Web 站点的多次访问标识用户并存储有关该用户的信息。
servlet 容器使用此接口创建 HTTP 客户端和 HTTP 服务器之间的会话。会话将保留指定的时间段,
跨多个连接或来自用户的页面请求。一个会话通常对应于一个用户,该用户可能多次访问一个站点。
服务器能够以多种方式维护会话,比如使用 cookie 或重写 URL。
此接口允许 servlet查看和操作有关某个会话的信息,比如会话标识符、创建时间和最后一次访问时间
将对象绑定到会话,允许跨多个用户连接保留用户信息当应用程序将对象存储到会话中或从会话中移除
对象时,该会话将检查对象是否实现了 HttpSessionBindingListener。如果实现了,则 servlet 将通
知该对象它已经被绑定到会话,或者已从会话中取消对它的绑定。通知是在绑定方法完成后发送的。对
于无效或过期的会话,通知是在会话已经无效或过期之后发送的。
当容器使用分布式容器设置在 VM 之间迁移会话时,所有实现 HttpSessionActivationListener 接口
的会话属性都会得到通知。
servlet 应该能够处理客户端选择不加入会话的情况,比如故意关闭 cookie 时。在客户端加入会话前,
isNew 一直返回 true。如果客户端选择不加入会话,则 getSession 将对每个请求返回一个不同的会
话,并且 isNew 将总是返回 true。
会话信息的范围仅限于当前 Web 应用程序 (ServletContext),因此存储在一个上下文中的信息在另一
个上下文中不是直接可见的。
-->
<%
out.print(session.getId() + "<br />");
/*
持久化session:
1.浏览器第一次访问,session去setCookie,发送给浏览器
2.浏览器带回来上面的Cookie:JSESSIONID
3.通过普通的Cookie(persistent cookies),去持久化
4.浏览器关闭之后打开,找到持久化的Cookie,发送给服务器(默认的session Cookie会在浏览器关闭之后消失)
*/
Cookie cookie = new Cookie("JSESSIONID",session.getId());
cookie.setMaxAge(30); //30s后消失
response.addCookie(cookie);
%>
</body>
</html>
运行结果:
微信公众号:JavaWeb架构师
其它
- 源码下载
关注下方公众号,回复:javaweb_course.code
-
欢迎加入交流群:451826376
-
更多信息:www.itcourse.top
网友评论