Request对象解决了一次请求内的不同 Servlet 的数据共享问题,那么一个用户的不同请求的处理需要使用相同的数据怎么办呢?使用session技术。
一 、Session
用户使用浏览器第一次向服务器发送请求,服务器在接受到请求后,调用对应的Servlet进行处理。在处理过程中会给用户创建一个session对象,用来存储用户请求处理相关的公共数据。
Session特点
HttpSession 对象可以在同一个客户的多个请求上保存对话状态。
它为特定的客户保持一个完整的会话。
可以用于存储会话中客户的所有请求中的任何东西。
1 session的工作原理
用户在浏览器发起请求到servletA,容器自动分配一个线程,该线程会查找与用户相关的session,并把请求的数据存储到session的属性中。我们可以通过请求去创建Session,获取Session。

相同的客户;相同的servlet;不同的请求;不同的线程;相同的session
只要不关闭浏览器,并且session不失效的情况下,同一个用户的任意请求在项目的任意Servlet中获取到的都是同一个session对象。
2 使用session
在响应中发送session cookie:在service方法中首次请求一个 session时,cookie操作自动完成。
1)新建Session对象
如果session中不存在,getSession()的数据返回null,此时就需要新建一个session。
1 | HttpSession session =req.getSession(); |
2)存储数据到session对象
当新建一个session之后,需要将从客户端获取的参数以名值对的形式存储到seesion中。
1 | session.setAttribute(String name,Object vlaue);//存储数据到session对象中 |
3)获取session对象
如果请求中包含一个session ID的cookie,则寻找与该ID匹 配的session;否则,如果没有包含session ID的cookie,或 者没有与该ID匹配的session,则创建一个新的session
1 | HttpSession session = req.getSession();//获取session对象 |
询问session是否为新建的,使用 session.isNew()
如果客户未使用过包含该session ID的响应,则该方法返回true
4)从session对象获取数据
1 | session.getAttribute(String uname);//注意:返回的object类型,需要强制转换 |
5)删除session中的数据
1 | session.removeAttribute(String uname);//注意:如果有数据则删除,没有则什么都不做 |
3 Session寿命周期
容器怎么知道客户已经走开,或者客户退出浏览器,或者客户计算机崩溃?上面的问题也就是容器怎么知道何时才能安全地销毁一个session?
此时我们就需要设置session的寿命周期。超过一定时间后,session就会销毁。用户下次访问就会新建一个新的session。
session的有效时间是指用户上一次发起请求和session被销毁之间的间隔
销毁session有3种方法
1)通过设置seesion超时
在DD中设置session超时
DD中设置的seesion的有效时间是以min计。
1 | <web-app ...> |
调用session对象上setMaxInactiveInterval()方法,这种方法设置的有效时间以秒计。
1
2HttpSession session = request.getSession();
session.setMaxInactiveInterval(3*60); //session的有效时间是3min
2) 调用session对象上的invalidate()方法
1 | session.invalidate();//强制销毁session |
3)web应用关闭(崩溃或反部署),比如关闭浏览器。
接下来我们考虑一些问题,容器如何区分客户?
HTTP是无状态的,所以每个请求都是一个新连接。容器认为每个请求都来自于一个新的客户。
容器不能区分客户的第二次请求与第一个请求属于同 一个客户
所以客户需要一个唯一的会话ID,在客户的首次请求中,容器生成一个唯一的会话ID 并将它用响应传回客户,以后的每次请求,客户都将这个会话ID发回。容器通过这个会话ID匹配session,并将 session与请求关联。
那么客户和容器间如何交换会话ID信息?
因此也就产生了cookie技术。
第二部分 cookie
2.1 Cookie是什么?
Cookie 是一小段文本信息,伴随着用户请求和页面在 Web 服务器和浏览器之间传递。Cookie 包含每次用户访问站点时 Web 应用程序都可以读取的信息。
如下图在用户第一次获得响应的时候,HTTP响应会添加Set-Cookie属性,其值是用户的sessionID。当用户在seesion周期内再次发起请求,HTTP请求中会添加一个cookie属性,其值就是用户的sessionID。
session在响应上面创建,session在请求上创建。

Cookie能做什么?
Cookie只是一段文本,所以它只能保存字符串。而且浏览器对它有大小限制以及 它会随着每次请求被发送到服务器,所以应该保证它不要太大。 Cookie的内容也是明文保存的,有些浏览器提供界面修改,所以, 不适合保存重要的或者涉及隐私的内容。
2.2 使用cookie
Cookie相关的操作都封装在Servlet API的HttpServletRequest类、HttpServletResponse和Cookie里面。

1)初始化cookie
1 | Cookie cookie = new Cookie("account", userId + "=" + password ); |
Session cookie的寿命期与 session一致,用户浏览器关闭后,就不存在了,但用户可以让cookie在浏览器关闭后保存在客户机上。
1 | //设置Maximum Age |
2)读取cookie
服务器端通过HttpServletRequest对象.getCookies()可获取cookies数组。
1 | //获取cookie |
这是一个cookies的简单例子,通过cookie储存用户的用户名,并且输出用户名。
1 | public class Login extends HttpServlet { |
这是一个seesion的例子,通过session获取客户端数据。
1 | public void doPost(HttpServletRequest request, HttpServletResponse response) |
html代码部分如下
1 | <form method="post" action="ShoppingCart.do"> |
输出结果如下图:

总结
cookie 和session 的区别:
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用COOKIE。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。