session会话追踪的实现机制

目录

一、概述

二、session

1.session介绍

2.session的操作方法

3.Session删除的时间

三、cookie

1.cookie介绍

2.创建并添加cookie

3.获取cookie

四、总结


一、概述

HTTP协议是一个无状态协议,即Web应用程序无法区分收到的两个HTTP请求是否是同一个浏览器发出的。例如:当一个用户登录成功后,如果他继续请求访问其他页面、当一个用户在操作自己的购物车时,请求添加购物车然后结账。如果Web程序如何不能区分请求是否为同一用户的,就会导致混乱,因此在Web应用程序中,我们经常要跟踪用户身份。

为了跟踪用户状态,服务器可以向浏览器分配一个唯一ID——Session ID,并以Cookie的形式发送到浏览器,浏览器在后续访问时总是附带此Cookie,这样,服务器就可以通过Cookie中的SessionID识别用户身份

session

1.session介绍

Session是指使用HttpSession对象实现会话跟踪的技术,是一种在服务器端保持会话跟踪的解决方案。HttpSession对象是javax.servlet.http.HttpSession接口的实例,也称为会话对象。JavaEE的Servlet机制内建了对Session的支持。当我们需要获取Session时,可以通过request请求对象的getSession()方法。

HttpSession session = req.getSession();

2.session的操作方法

获取HttpSession后,常见的操作方法有:
1.void setAttribute(String name, Object value):将指定Key-Value键值对,存入当前Session会话中。

//将map作为Value值,存入当前Session会话中。
session.setAttribute("shoppingcart",map);


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

//按照指定的Key从当前Session会话中获取Value
Map<String, Integer> map=(Map<String, Integer>)session.getAttribute("shoppingcart");


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

注意:HttpSession的invalidate()方法也可以删除value值,但是会摧毁session,同时删除value的内容,再次发起请求时会得到新的session。

@WebServlet("/clear.do")
public class ClearShoppingCardServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession session=request.getSession();
//		System.out.println("清空购物车:"+session.getId());
		
		//摧毁session,内容一起会被删除,再次发起请求会得到新的session
//		session.invalidate();
		//只删除session内的内容,不摧毁session,再次发起请求得到原来的session
//		session.removeAttribute("shoppingcart");
	}
}

4.String getId():获取当前Session会话的SESSION ID。
5.long getCreationTime():获取当前Session会话的创建时间。
6.long getLastAccessedTime():获取当前Session会话最后一次请求的访问时间。


@WebServlet("/demo.do")
public class SessionDemoServlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//获取会话
		HttpSession session=req.getSession();
		System.out.println("sesson id:"+session.getId());
		System.out.println("session创建时间:"+new Date(session.getCreationTime()));
		System.out.println("最后访问时间:"+new Date(session.getLastAccessedTime()));
	}
}

执行结果如下:

HttpSession对象会在用户第一次访问服务器时由容器创建(注意只有访问JSP、Servlet等程序时才会创建,只访问HTML、IMAGE等静态资源并不会创建),当用户调用其失效方法(invalidate()方法)或超过其最大不活动时间时会失效。在此期间,用户与服务器之间的多次请求都属于同一个会话

使用Session时,由于服务器把所有用户的Session都存储在内存中,如果遇到内存不足的情况,就需要把部分不活动的Session序列化到磁盘上,这会大大降低服务器的运行效率,因此,放入Session的数据不能太大,否则会影响服务器的运行。

服务器依靠一个名为JSESSIONID的Cookie来识别Session。在Servlet中第一次调用req.getSession()时,Servlet容器自动创建一个Session ID,然后通过一个名为JSESSIONID的Cookie发送给浏览器:

@WebServlet("/test_session.do")
public class TestSessionServlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("servlet被请求到");
		//第一次
		HttpSession session = req.getSession();
		System.out.println("session id:"+session.getId());
	}
}

3.Session删除的时间

1.服务器关闭或服务停止

2.程序调用HttpSession.invalidate()

3.Session超时:超时指的是连续一定时间服务器没有收到该Session所对应客户端的请求,并且这个时间超过了服务器设置的Session超时的最大时间。

cookie

1.cookie介绍

Cookie英⽂意思是甜点的意思,我们可以在Web应⽤程序中可以使⽤cookie在客户端保持HTTP状态信息。cookie相当于是web服务器送给客户端浏览器的甜点。⾄于什么时候送,送什么样的甜点,有效期是多常时间,完全由服务器来决定。

Cookie在HTTP中通常是用来辨别用户身份,进行会话跟踪而储存在用户本地终端上的数据,一般会加密处理,由用户客户端计算机暂时或永久保存的信息。其结构就是一个键和一个值构成的。随着服务器端的响应发送给客户端浏览器。然后客户端浏览器会把Cookie保存起来,当下一次再访问服务器时把Cookie再发送给服务器。

通过创建Cookie,我们可以实现在客户端浏览器中存储数据的目的,例如保存用户名和密码。在Chrome浏览器中,单个 Cookie的长度不能超过 4069 个字符(包括 name,但不包括 = 号)。

2.创建并添加cookie

@WebServlet("/test_cookie.do")
public class TestCookieServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("servlet被请求到");
		//创建Cookie对象
		Cookie cookie1=new Cookie("phonenumber", "17868641234");
		Cookie cookie2=new Cookie("username", "xiaoguo");
		Cookie cookie3=new Cookie("useremail", "17868641234@qq.com");
//		cookie.setMaxAge(60*60*24*7);  //单位:秒 
		//响应
		response.addCookie(cookie1);  //将cookie添加至响应头
		response.addCookie(cookie2);
		response.addCookie(cookie3);
	}
}

执行后,可以看到:

3.获取cookie

当然,我们也可以对cookie进行获取输出至控制台上:

@WebServlet("/test_getcookievalue.do")
public class TestGetCookieServlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("获取cookie值");
		Cookie[] cookieArr=request.getCookies();
		//当获取到的不为null
		if(cookieArr!=null) {
			for(Cookie cook:cookieArr){
				System.out.println(cook.getName());
				System.out.println(cook.getValue());
				System.out.println();
			}
		}
	}
}

总结

Servlet容器提供了Session机制以跟踪用户;

Session数据存储在服务器端,Cookie数据存储在客户端;

默认的Session机制是以Cookie形式实现的,Cookie名称是JSESSIONID;它是服务器识别Session的关键;

  • 34
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值