Session会话追踪的实现机制

一、会话

        前面我们学习了Servlet的生命周期,每次访问Servlet时,都要经历实例化、初始化、服务、销毁四个阶段。那么当然,实例化、初始化、销毁这三个阶段只执行在服务器启动和关闭阶段,所以,我们可以简单的理解为,从服务器启动到停止对服务器的访问就是一个会话,从客户端的角度来讲,从用户访问浏览器到关闭浏览器的这一过程就是一个会话,那么如果有多个用户访问一个浏览器,浏览器怎么区分谁是谁呢?这就需要SessionID来起作用了。

二、Session

        我们把这种基于唯一ID识别用户身份的机制称为Session。每个用户第一次访问服务器后,会自动获得一个Session ID。如果用户在一段时间内没有访问服务器,那么Session会自动失效,下次即使带着上次分配的Session ID访问,服务器也认为这是一个新用户,会分配新的Session ID。一次Session会话中往往包含着若干次request请求。  

Session对象的常见方法

// 获取Session
HttpSession session = request.getSession();

// 将指定Key-Value键值对,存入当前Session会话中。
void setAttribute(String name, Object value);

// 按照指定的Key从当前Session会话中获取Value,返回值为Object类型的对象,如果不存在,则返回null。
Object getAttribute(String name);

// 按照指定的Key从当前Session会话中删除Key-Value键值对。
void removeAttribute(String name);

// 获取当前Session会话的创建时间。
long getCreationTime();

// 获取当前Session会话最后一次请求的访问时间。
long getLastAccessedTime();

// 获取当前Session会话的SESSION ID
String getId();

三、Cookie

        为了跟踪用户状态,服务器服务器通过SessionID,并以Cookie的形式发送到浏览器,浏览器在后续访问时总是附带此Cookie,这样,服务器就可以识别用户身份。 cookie英文意思是甜点的意思,那么在web中,可以理解为服务器与浏览器之间传递的各种信息,以实现在客户端浏览器存储数据的目的,至于什么时候送,送什么样的甜点,有效期是多长时间,完全由服务器来决定。

一个实例:在Cookie中传递SessionID

        我们定义了一个doGet()方法,内部先不写逻辑,我们看一下浏览器中的Cookie

package com.fulian.web.servlet;

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;

@WebServlet("/test_session.do")
public class TestSessionServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	
	}
}

 在开发者工具中Application的Cookies中,可以看见Name这一列中没有SESSIONID这一字段,然后我们通过request请求获取Session并把SessionId从控制台打印出来:

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		HttpSession session = req.getSession();
	    System.out.println(session.getId());	
	}

         可以看到:Name中出现了一个JSESSIONID的字段并且Value和控制台中打印的SessionID相同,所以可以得出这样一个结论:当服务器创建了一个HttpSession对象中,会生成一个名为JSESSIONID的值,并返回给对应客户端的Cookie中,后续客户端再次发送请求时,服务器会先从cookie中获取到JSESSIONID,根据ID找到对应的Session',如果没有JSESSIONID,就等待服务器创建Session,因为如果每次都创建Session,服务器把所有用户的Session都存储在内存中,如果遇到内存不足的情况,就需要把部分不活动的Session序列化到磁盘上,这会大大降低服务器的运行效率。 

又一个实例:在Cookie中存储数据

package com.fulian.web.servlet;

import java.io.IOException;

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

@WebServlet("/test_cookie.do")
public class TestCookieServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("cookie被单机了");
	
		// 创建Cookie对象
		Cookie cookie = new Cookie("number", "12138");
		cookie.setMaxAge(60*60*24*7); // 设置过期时间
		
		// 响应
		resp.addCookie(cookie); // 添加至响应头
	
	}
}

 四、Cookie和Session的区别

1.Cookie是存在浏览器中的,Session是存在服务器中的

2.Cookie的安全性要低于Session,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。

3.Cookie可能会被用户禁用
 Session的数据是存在服务器内存中,关掉浏览器,会清空Session
 临时性Cookie存在浏览器的缓存中,关掉浏览器,会清空
 永久性Cookie是存在临时文件中,到达有效期前,一直存在
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仙草不加料

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值