一 概述
当浏览器第一次给服务器发送请求时会建立一次会话,直到一方断开为止,一次会话一般包含多次请求和响应。主要作用是保证在这次会话的范围内实现数据的共享。
实现的方式有:1.客户端会话:Cookie;2. 服务端会话:Session;
二 会话之服务端会话——Session
session为服务端会话技术,在一次会话的多次请求之间共享数据,将数据保存在服务器端的HttpSession对象中。
服务端会话的实现:
获取HttpSession对象
public class SessionAccept extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取session
HttpSession session = request.getSession();
//2.存储数据
session.setAttribute("msg","hello session");
}
}
使用HttpSession对象,主要是通过HttpSession对象使用以下方法:
1. Object getAttribute(String name)
2. void setAttribute(String name, Object value)
3. void removeAttribute(String name)
Session的实现是依赖于cookie的,具体的实现如图所示:
第一次请求的响应头的set-cookie信息:
第二次请求的请求头的cookie信息:
Session的细节问题:
1. 当我们的客户端关闭后,服务器不关闭,两次获取的session在默认情况下不是同一个,如果要保证是同一个,我们可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存。
Cookie cookie = new Cookie("JSESSIONID",session.getId());
cookie.setMaxAge(60*60);
response.addCookie(cookie);
2. 当客户端不关闭,服务器关闭后,两次获取的session是不同的,但是为了确保数据不会丢失,tomcat会自动是实现session的钝化(在服务器正常关闭之前,将session对象序列化到硬盘上,进行持久化保存)和session的活化(在服务器启动后,将session文件转化为内存中的session对象)。
3. session的不同销毁时间
(1) 服务器关闭时
(2)session对象调用invalidate()方法时。
(3)tomcat中的session默认失效时间为30分钟,我们可以对其进行修改。
<session-config>
<session-timeout>30</session-timeout>
</session-config>
Session的特点:
1. session用于存储一次会话的多次请求的数据,在服务器端保存,所以session中的数据比Cookie中数据的安全。
2. session可以存储任意类型,因为sesssion使用的是setAttribute(String name, Object value)方法,值value的类型为Object,任意大小的数据,但是Cookie的数据大小和数据类型是受到限制的。(Cookie默认为String类型数据,因为构造方法使用的是Cookie(String name, String value))。