(14)Session对象介绍与使用

(14)Session对象介绍与使用

前言

我们在前面 Java EE基础(12):Cookie对象介绍与使用 中学习了Cookie,解决了不同请求间的数据共享问题
案例:Java EE基础(13):Cookie三天免登录案例(附源码)

这次我们要开始学习另一个重要的数据存储技术,Session技术。具体请看下面介绍。

一、Seesion介绍

1.是什么

Session是另一种记录客户状态的机制。
不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。客户端浏览器再次访问时只需要从该 Session 中查找该客户的状态就可以了。
用户使用浏览器访问服务器的时候,服务器把用户的信息以某种的形式记录在服务器,这就是Session。

上面那么长一段你不理解没关系。

就简单理解Session就是会话,Session翻译也有会话的意思。那么是谁和谁的会话呢?当然是浏览器和服务器的会话。

会话又是啥?你可以理解成Session指的就是用户在浏览某个网站时,进入网站到浏览器关闭的这段时间,就是会话。

2.作用。

想一下,request对象解决了不同Servlet间数据共享问题。那么一个用户的不同请求的处理,需要相同数据时候怎么办?这时候就可以使用Session。

Session解决了一个用户的不同请求的数据共享问题,只要Cookie中的JSESSIONID和session对象不是小的情况下,用户的任意请求都嫩获取到同一个session对象。

备注:一般情况下,用户在登录Web项目时会将该用户的个人信息存储到Session中,供该用户的其他请求使用。

3.原理

在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当该用户使用浏览器访问其它程序(页面)时,其它程序可以从用户的session中取出该用户的数据,为用户服务。

用户第一次使用浏览器向浏览器发送请求,服务器在接受请求后,调用Servlet进行处理。在处理的过程中,创建一个Session对象,用来存储用户请求处理的公共数据,并将此Session对象的JSESSIONID(Session的ID,用于表示Session对象)以Cookie的形式存储在浏览器中(临时的存储,不设置Cookie时间,浏览器关闭即失效)。

此时用户在发起第二次请求以及后续请求时,请求信息中会附带Cookie中的JSESSIONID。服务器接受到请求后,调用相应的Servlet进行请求处理。同时根据JSESSIONID返回对应的Session对象。

  • 问:多个用户访问时访问的Session对象一样吗?
  • 答:不一样,可以看上面得知。服务器会为每个用户浏览器创建一个会话对象,也就是Session对象。
  • 问:那怎么知道哪一个Session是张三的,哪一个是李四的呢?
  • 答:每一个Session都有一个唯一的id,根据id区分。服务器在为用户浏览器创建Session对象的同时,还创建了一个Cookie,这个Cookie中键为JSESSIONID,值就是当前用户Session的id。并且将这个Cookie对象返回给了浏览器,这个Cookie对象默认是没有设置最大时间的(不设置Cookie时间,浏览器关闭即失效)。这也就是为什么同一个用户第二次及后续请求时还能知道该用哪一个Session对象的原因。

4.作用域

作用域为:在JSESSEIONID和Session对象没有失效的情况,一次会话(网站打开到浏览器关闭这段时间为一次会话)

只要不关闭浏览器,并且Cookie中的JSESSEIONID没有被清除,session没有失效。那么同一个用户的任意请求在项目的任意Servlet中获取到的都是同一个session。

5.特点

  • 存储在服务器端,服务器进行创建。
  • 依赖Cookie技术
  • 一次会话(网站打开到浏览器关闭这段时间为一次会话)

6.Session和Cookie区别

  • 存储位置:Cookie是浏览器端存储技术。Session是服务器端存储技术,由服务器创建。
  • 存储量:Cookie的存储量是被限制的,只允许4KB,而session是无限量的。
  • 安全:Cookie存在客户端的浏览器,我们可以随意看到。但是Session不一样,他存在服务器端,我们无法轻松的访问会话值,因此Session更安全。

总结:看了上面的Session原理和特点,你应该知道了Session依赖Cookie,并且Session是和Cookie搭配一起使用的,解决了同一个用户不同请求的处理,需要相同数据问题。


二、Session的简单使用

1.获取id

  • 代码
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Session简单使用
 * 
 * @author changsheng
 */
@WebServlet("/SessionServlet")
public class SessionServlet extends HttpServlet {

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 1.设置请求编码格式
		req.setCharacterEncoding("utf-8");
		// 2.设置响应编码格式
		resp.setHeader("content-type", "text/html;charset=utf-8");
		// 3.获取请求信息
		// 4.处理请求信息
		StringBuilder print = new StringBuilder();
		HttpSession session = req.getSession(); // 获取Session对象
		String id = session.getId(); // 获取Session对象的Id
		int max = session.getMaxInactiveInterval(); // 返回servlet容器将在两个客户端访问之间保持会话开放的间隔的最大时间,以秒计时。 (获取Session存储时间)
		print.append("当前用户浏览器Session对象的Id为:"+id+"\n最大时间:"+max);
		// session.setMaxInactiveInterval(60*60*2); // 指定在客户端请求消息之间servlet容器将该会话设为无效之前的以秒计的时间。 (设置Session存储时间)	
		// session.invalidate(); // session强制失效
		// 5.响应处理结果
		System.out.println(print); // 打印Session对象id
		resp.getWriter().write(print.toString());
	}

}

  • 运行
    在这里插入图片描述
    在这里插入图片描述

2.数据存储与获取

  • 代码
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Session的数据存储与获取
 * 
 * @author changsheng
 */
@WebServlet("/SessionGetSetDataServlet")
public class SessionGetSetDataServlet extends HttpServlet {

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 1.设置请求编码格式
		req.setCharacterEncoding("utf-8");
		// 2.设置响应编码格式
		resp.setHeader("content-type", "text/html;charset=utf-8");
		// 3.获取请求信息
		// 4.处理请求信息
		StringBuilder print = new StringBuilder();
		HttpSession session = req.getSession(); // 获取Session对象
		session.setAttribute("username", "zhangsan"); // 将这个键值对存放在session对象中,和request对象一样使用。
		session.setAttribute("aeg", 18);
		String username = (String) session.getAttribute("username"); // 获取值,和request对象一样用
		int age = (int) session.getAttribute("aeg"); // 获取值,和request对象一样用
		print.append(username + " - " + age);
		// 5.响应处理结果
		System.out.println(print); // 打印Session对象id
		resp.getWriter().write(print.toString());
	}

}
  • 运行
    在这里插入图片描述

参考链接

cookie与session的区别是什么