33、JAVA_WEB开发基础之会话机制

版权声明:chaizepeng https://blog.csdn.net/chaizepeng/article/details/86700386

会话是什么

一个客户端浏览器与web服务器之间连续发生的一系列请求和响应过程就是会话,这些过程中产生的一系列信息就是会话信息,会话机制就是用于维护这些信息一致性的一种技术。通俗的说就是,一个A账号访问服务器,进行多次交互产生了一些信息,对于无状态Http协议来说,每来一次请求他都会处理一次,认为是一次新客户端的请求,所以他没有办法维护这些信息的一致性,所以便出现了会话这一概念,有了会话技术,就可以记录下A与服务器交互产生的信息。

如何实现

现在基本都是HTTP协议,而HTTP协议是没有状态的,所以无法记录多个请求下的一系列信息,所以就需要借助一些技术来维护服务器和浏览器之间的会话信息,这里有两种技术,分别是:Cookie和Session。

Cookie会话技术

cookie采用在客户端保持http状态信息的方案,通过将状态信息保存在客户端来保持会话状态。cookie是浏览器访问web服务器的某个资源时,由web服务器在http响应消息头中附带传送给浏览器的小文本文件。当发生交互时,web服务器通过在http相应消息中增加Set-Cookie响应头字段将Cookie信息发送给浏览器,浏览器则通过在http请求消息中增加Cookie请求头字段将Cookie回传给web服务器,使用cookie头字段来确认交互属于同一会话过程。

cookie的工作过程图示如下:

客户端一方会将cookie信息如何存储呢?这里说一下,cookie信息可以被存储在浏览器内存中,当关闭浏览器时,cookie就失效,这就是会话cookie;也可以通过设置将cookie信息存放在客户端主机的磁盘中,这就是持久化cookie。

cookie保持会话状态工作原理代码体现如下:

// 获取客户端的cookie
Cookie[] cookies = request.getCookies();
// 如果有cookie
if (cookies != null && cookies.length > 0) {
	for (Cookie c : cookies) {
		//获取cookie名
		String name = c.getName();
		//获取cookie值
		String value = c.getValue();
		if ("cookie_id_one".equals(name) && "123456".equals(value)) {
			//可以保持会话
		}
	}
}else{//客户端还没有cookie值,传回一个
	// 将cookie由服务器返回给客户端
	Cookie cookie = new Cookie("cookie_id_one", "123456");
	// 设置最大失效是时间是3600秒 ,若为负数则表示不存储这个cookie
	cookie.setMaxAge(3600);
	response.addCookie(cookie);
}

Session会话技术

扫描二维码关注公众号,回复: 5445024 查看本文章

session采用在服务器端保持http状态信息的方案,通过将状态信息保存在服务器端来保持会话状态。其工作原理大致为:服务器检查客户端传来的请求中是否包含一个sessio标识,如果已经包含,服务器就按照此sessioid检索出此用户信息,如果请求中不包含sessionid,服务器则创建一个sessionid并发送给客户端保存,使用JSESSIONID来表示。

session的工作原理图如下所示:

说一个概念,session cookie,他和上边的cookie不同,他指的是sessionid在客户端保存时的一个参数标记,服务器传送sessionid到客户端时,会创建一个JSESSIONID,它的值就是sessionid,JSESSIONID存储在session cookie中,session cookie存在于浏览器的内存中,所以当浏览器关闭时,session cookie就消失了,而服务器端的session对象不会消失。

java中使用HttpSession来表示session会话,他的基本方法如下:

//使用请求对象创建会话对象
HttpSession session = request.getSession();
//获取到sessionId
String sessionId = session.getId();
if (sessionId != null && sessionId != "") {
	//设置超时时间
	session.setMaxInactiveInterval(6000);
	//可以直接销毁此sessionid以结束此次会话
	session.invalidate();
	//获取sessionID
	session.getId();
	//等等
}

猜你喜欢

转载自blog.csdn.net/chaizepeng/article/details/86700386