Session会话追踪的实现机制

        HTTP协议是一个无状态协议,即Web应用程序无法区分收到的两个HTTP请求是否是同一个浏览器发出的。为了跟踪用户状态,服务器可以向浏览器分配一个唯一ID,并以Cookie的形式发送到浏览器,浏览器在后续访问时总是附带此Cookie,这样,服务器就可以识别用户身份。

什么是会话跟踪技术?

        会话就是客户端与服务器之间的一次交互,在一次交互中可能会包含多次请求和响应。在JavaWeb中,从客户端向服务器发出第一个请求开始,会话就开始了,直到客户端关闭浏览器会话结束。在一个会话的多个请求中共享数据,这就是会话跟踪技术。

Session


        Session是指使用HttpSession对象实现会话跟踪的技术,是一种在服务器端保持会话跟踪的解决方案。HttpSession对象是javax.servlet.http.HttpSession接口的实例,也称为会话对象。
        HttpSession对象会在用户第一次访问服务器时由容器创建(注意只有访问JSP、Servlet等程序时才会创建,只访问HTML、IMAGE等静态资源并不会创建),当用户调用其失效方法(invalidate()方法)或超过其最大不活动时间时会失效。在此期间,用户与服务器之间的多次请求都属于同一个会话。

代码示例:

package com.my.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.do")
public class TestServlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("大胆,我被请求到了!");

		// 第一次在访问session时,服务器会创建session
		// 并根据Session_id,创建一个名称为JSESSIONID的Cookie,将Session_id保存至Cookie
		// 将该Cookie响应回至浏览器客户端保存
		// 接下来的每次发起请求时,客户端浏览器都会在请求头中 添加 JSESSIONID

		HttpSession session = req.getSession();
		System.out.println(session.getId());

	}
}

浏览器中查看:

 控制台查看:

          通过请求路径在浏览器向服务器发起两次请求,可以看到两次请求的会话ID都一样,属于同一个会话。

注意:第一次在访问session时(即req.getSession()),服务器才会创建session。

Cookie

        cookie英⽂意思是甜点的意思,我们可以在Web应⽤程序中可以使⽤cookie在客户端保持HTTP状态信息。cookie相当于是web服务器送给客户端浏览器的甜点。⾄于什么时候送,送什么样的甜点,有效期是多常时间,完全由服务器来决定。
      Cookie在HTTP中通常是用来辨别用户身份,进行会话跟踪而储存在用户本地终端上的数据,一般会加密处理,由用户客户端计算机暂时或永久保存的信息。其结构就是一个键和一个值构成的。随着服务器端的响应发送给客户端浏览器。然后客户端浏览器会把Cookie保存起来,当下一次再访问服务器时把Cookie再发送给服务器。

Cookie的用法:

        在Javaweb中可以基于servlet创建Cookie,设置属性

代码示例:

package com.my.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("/getcookie.do")
public class TestGetCookieServlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 创建Cookie对象
		Cookie cookie1 = new Cookie("phone_number", "15129802903");
		Cookie cookie2 = new Cookie("name", "pig");
		Cookie cookie3 = new Cookie("age", "15");

		// 设置Cookie的过期时间,默认跟Session的一致
		cookie1.setMaxAge(60 * 60 * 24 * 7);//7天
		cookie2.setMaxAge(60 * 60 * 24 * 20);//20天

		// 响应
		resp.addCookie(cookie1);// 将Cookie添加至响应头
		resp.addCookie(cookie2);// 将Cookie添加至响应头
		resp.addCookie(cookie3);// 将Cookie添加至响应头

	}
}

可在浏览器查看:

 

总结

  • Cookie是把用户的数据写给用户的浏览器。
  • Session技术把用户的数据写到用户独占的Session中。

        服务器在创建会话对象时,会为其分配一个唯一的会话标识——SessionId,以“JSESSIONID”的属性名保存在客户端Cookie中,在用户随后的请求中,服务器通过读取Cookie中的JSESSIONID属性值来识别不同的用户,从而实现对每个用户的会话跟踪。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值