微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JavaEE——Session会话追踪的实现机制

引言

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

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

Session

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

Session在什么时候被创建

package com.ywh.web.sevlet;

import java.io.IOException;

import javax.servlet.ServletContext;
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;
import javax.servlet.http.HttpSession;

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

		System.out.println("TestSessionServlet被请求到!");
		
	}
}

 

 

启动服务器,在客户端发起请求后,虽然服务器收到请求,并做出了响应。但在浏览器里却并没有看到我们想看到的Cookie——JSESSIONID。即Session没有被创建出来。JavaEEServlet机制内建了对Session支持。当我们需要获取Session时,可以通过request请求对象的getSession()方法获取Session后,浏览器就会知道我们将会开启会话,这个时候服务器才会把SessionID以Cookie的形式响应给客户端:

package com.ywh.web.sevlet;

import java.io.IOException;

import javax.servlet.ServletContext;
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;
import javax.servlet.http.HttpSession;

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

		System.out.println("TestSessionServlet被请求到!");
		HttpSession session = req.getSession();
		System.out.println(session.getId());
		//创建Cookie
		Cookie cookie1 = new Cookie("phone_number1", "18799998888");
		Cookie cookie2 = new Cookie("phone_number2", "18799991111");
		Cookie cookie3 = new Cookie("phone_number3", "18799992222");
		Cookie cookie4 = new Cookie("phone_number4", "18799993333");
		Cookie cookie5 = new Cookie("phone_number5", "18799994444");
		//设置Cookie的时间
		//cookie.setMasAge();单位是秒
		//把Cookie存入
		resp.addCookie(cookie1);
		resp.addCookie(cookie2);
		resp.addCookie(cookie3);
		resp.addCookie(cookie4);
		resp.addCookie(cookie5);
		

	}
}

 我们也可以在程序中自己创建出Cookie对象,然后响应给浏览器(客户端)

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

获取HttpSession后,常见的操作方法有:

  • void setAttribute(String name, Object value):将指定Key-Value键值对,存入当前Session会话中。
  • Object getAttribute(String name):按照指定的Key从当前Session会话中获取Value,返回值为Object类型的对象,如果不存在,则返回null
  • void removeAttribute(String name):按照指定的Key从当前Session会话中删除Key-Value键值对。
  • long getCreationTime()获取当前Session会话的创建时间。
  • long getLastAccessedTime()获取当前Session会话最后一次请求的访问时间。
  • String getId()获取当前Session会话的SESSION ID

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

Cookie

实际上,Servlet提供的HttpSession本质上就是通过一个名为JSESSIONIDCookie来跟踪用户会话的。除了这个名称外,其他名称Cookie我们可以任意使用。

创建一个Cookie时,除了指定名称和值以外,通常需要设置setPath("/"),浏览器根据此前缀决定是否发送Cookie。如果一个Cookie调用setPath("/user/"),那么浏览器只有在请求以/user/开头的路径时才会附加此Cookie。通过setMaxAge()设置Cookie的有效期,单位为秒,最后通过resp.addCookie()把它添加到响应。

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

读取Cookie

package com.ywh.web.sevlet;

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 Test_cookie extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws servletexception, IOException {
		Cookie[] cookies = req.getCookies();
		if (cookies != null) {
			for (Cookie ck : cookies) {
				System.out.println(ck.getName());
				System.out.println(ck.getValue());
			}
		}
	}
}

 读取Cookie要通过HttpServletRequest 对象req调用getCookies()方法,此方法返回用户请求中附带的所有Cookie。

总结

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

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

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

原文地址:https://www.jb51.cc/wenti/3280450.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐