session何时访问不到

一.结论:
1.当在同一个浏览器中同时打开多个标签,可以访问同一个session;
2.当用同一个浏览器打开两个独立窗口, 可以访问同一个session;
3.当使用不同的浏览器时,发送请求,即使发送相同的请求,是不同的session;
4.当把当前某个浏览器的所有窗口都关闭,再打开,发起相同的请求时,是不同的session。

二.原理:
A.Session工作原理:
当一个Session开始时,Servlet容器会创建一个HttpSession对象,那么在HttpSession对象中,可以存放用户状态的信息,Servlet容器为HttpSession对象分配一个唯一标识符即Sessionid,Servlet容器把Sessionid作为一种Cookie保存在客户端的浏览器中(实际是保存在浏览器的进程中,没保存在浏览器所在电脑的硬盘中)用户每次发出Http请求时,Servlet容器会从HttpServletRequest对象中取出Sessionid,然后根据这个Sessionid找到相应的HttpSession对象,从而获取用户的状态信息。(因为sessionid作为cookie是保存在浏览器的进程中的,所以关闭浏览器后就session就失效了<访问不到了>. 由于服务器会为不同品牌的浏览器创建对应的session<一个浏览器对应一个session对象>所以用不同的浏览器访问不到)

**解决方法:**我们可以创建一个名称为JSESSIONID的cookie,其中保存session的ID,并设置cookie的最大存活时间,让cookie保存到硬盘上(即使浏览器关闭,cookie也不会销毁),这样下次访问服务器时,还可以将sessionid带给服务器,服务器可以通过sessionid获取到之前的session。 从session中获取到商品信息

在这里插入图片描述

B.Session销毁时机:
一个是Session.invalidate()方法,不过这个方法在实际的开发中,并不推荐,在强制注销用户的时候会使用;
一个是session超过默认时间后(或者超过设定的时间)(就是session超时),Session会销毁。

注:请求数据包和响应数据包的格式
https://blog.csdn.net/m_miao001/article/details/81085889
请求数据包结构:
一、【请求行】:请求行在请求数据包的第一行,包含请求类型(get/post)、请求资源路径、协议的版本和类型。
二、【消息头】(也叫请求头或请求消息头):若干消息头样式(w3c定义的一些有特殊意义的键值对),如content-type=text/html,charset=utf-8等,服务器端和客户端都会遵循消息头的约定,也可以通过代码设置。
三、【空行】请求头与请求体之间用一个空行隔开;
四、【消息正文】也叫实体内容或者请求实体内容或请求体:如果请求方式为post,请求参数和值就会放在这里,如果为get那么请求参数和值就会包含在资源路径上。

响应数据包:
一、【状态行】:包含两部分内容的协议的版本和类型,状态码(500表示程序出错,404找不到资源路径,200正常运行)。
二、【消息头】(也叫响应头或响应消息头):同上。
三、【空行】响应头与响应体之间用一个空行隔开;
四、【响应正文】也叫实体内容或者响应实体内容或响应体:服务器返回给浏览器的处理结果。

注: 会话是什么?
当浏览器发请求访问服务器开始,到访问服务器结束,浏览器关闭为止,这期间产生的所有请求和响应加在一起,就称之为浏览器和服务器之间的一次会话
https://blog.csdn.net/weixin_45151795/article/details/105999915

注:cookie传送数据原理
https://blog.csdn.net/qq_39323945/article/details/104600643
在这里插入图片描述
cookie默认的生命周期在浏览器关闭后就结束了。创建cookie的路径下及其子路径下可以访问到cookie(或者给cookie设置的路径及其子路径下能访问到cookie)

通过Set-Cookie响应消息头将cookie从服务器端发送给浏览器,让浏览器保存到内部;而浏览器一旦保存了cookie,以后浏览器每次访问服务器时,都会通过cookie请求消息头,将cookie信息再带回服务器中。

在这里插入图片描述

注:session和cookie两者的区别
Cookie和session都属于会话技术,都可以保存会话中产生的数据,但由于cookie和session的工作原理和特点不同,因此两者的应用场景也不一样。

Cookie的特点:

cookie是将会话中产生的数据保存在浏览器客户端, 是客户端技术(JS可以访问cookie)

cookie是将数据保存在客户端浏览器,容易随着用户的操作导致cookie丢失或者被窃取,因此cookie中保存的数据不太稳定,也不太安全。

但cookie将数据保存在客户端,对服务器端没有太多影响,可以将数据保存很长时间。
cookie只能保存文字不能保存对象(session可以)
cookie保存中文需要用URLEncoder.encode(数据,“utf-8”)进行编码. 然后用URLDecoder.decode(数据,“utf-8”)进行解码

总结:因此cookie中适合存储需要长时间保存、但对安全性要求不高的数据。

浏览器对cookie的大小和个数都有限制,一般推荐每一个站点给浏览器发送的cookie数量不超过20个,每一个cookie的大小不超过4kb。超过的话就得分多个cookie存储或采用session存储.
Cookie的应用:实现购物车、记住用户名、30天内自动登录等。
在这里插入图片描述
Session的特点:

session是将会话中产生的数据保存在服务器端,是服务器端技术
session将数据存在服务器端的session对象中,相对更加的安全,而且更加稳定。不容易随着用户的操作而导致session中的数据丢失或者是被窃取。
但session是服务器端的对象,在并发量较高时每一个浏览器客户端在服务器端都要对应一个session对象,占用服务器的内存空间,影响效率。
总结:因此session中适合存储对安全性要求较高,但不需要长时间保存的数据。 cookie有路径问题限制(看最后的解释), session没有路径问题
Session的应用:保存登录状态、保存验证码

Cookie路径问题:
创建cookie的路径下及其子路径下可以访问到cookie(或者给cookie设置的路径及其子路径下能访问到cookie)
在这里插入图片描述
A.创建cookie的servlet: 给cookie设置路径为"/day65_servlet0711/test/t"

package com;
public class SetCookie extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		Cookie cookie = new Cookie("cookiePath", "CookieValue-ggg");
		cookie.setPath("test/t");//cookie要么用相对路径写(不以斜杠开头).  要么用"/项目名"字开头(这样是用绝对路径写), 但不能以斜杠开头(斜杠后不写项目名)
		response.addCookie(cookie);
		System.out.println("success");
	}
}

B.获取cookie的servlet, 用"/test/t"能访问到cookie, 用"/test/t/x"能访问到cookie, 用"/test/"访问不到cookie
(给cookie设置的路径及其子路径下能访问到cookie)

package com;

import java.io.IOException;
@WebServlet("/test/t")
public class GetCookie extends HttpServlet{
	private static final long serialVersionUID = 1L;

	public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.getWriter().print("aa");
		Cookie[] cs=request.getCookies();
		if(cs!=null){
			for (Cookie c : cs) {
					System.out.println(c.getName()+"-"+c.getValue());
			}
		}
	}
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值