day21-web开发会话技术03
WEB开发会话技术03
10.问题引出
问题引出
- 不同的用户登录网站后,不管该用户浏览网站的哪个页面,都可以显示登录人的名字,还可以随时去查看自己购物车中的商品,这是如何实现的呢?
- 也就是说,一个用户在浏览一个网站的不同页面时,服务器是如何知道是张三在浏览这个页面,还是李四在浏览这个页面?

解决方法1- 使用cookie
在用户登录的时候,服务器可以将用户信息通过cookie的形式保留在浏览器。每当用户访问不同的网页(发送HTTP请求),浏览器都会将该cookie发送给服务器,服务器通过获取cookie的值,在网页上就可以显示当前用户的信息;同时服务器也可以通过cookie(用户信息)找到用户操作用户在数据库中对应的数据。
但是使用cookie会存在以下问题:第一是cookie不能存放大的数据;第二是cookie不安全,不能存放敏感信息;第三,cookie不是跟一个用户关联的。如果一个cookie是长期保存的,那么当其他人打开浏览器时,也可以登录你的账号,因此单单使用cookie来实现也不太理想。
解决方法2- 使用session
session是服务器端的技术,也就是说session的数据是保存在服务器端的。服务器在运行时会为每一个用户的浏览器创建一个其独享的session对象(该对象可以理解为一个集合)。
由于session为每个用户浏览器独享,所以用户在访问服务器的不同页面时,可以从各自的session中读取/添加数据,从而完成任务。
11.Session基本介绍

当用户打开浏览器,访问某个网站,操作session时,服务器就会在内存(在服务端)为该浏览器分配一个session对象,该session对象被这个浏览器独占,如上图
这个session对象也可以看做是一个容器/集合,session对象默认存在的时间为30min(在tomcat/conf/web.xml中可以修改)

11.1session可以做什么
- 网上商城的购物车
- 保存登录用户的信息
- 将数据放入到Session中,供用户在访问不同页面时,实现跨页面访问数据
- 防止用户非法登录到某个页面
- .......
11.2如何理解session
session存储结构示意图

你可以把session看做是一容器(类似HashMap),有两列(k-v),每一行就是session的一个属性
每个属性包含有两个部分,一个是该属性的名字(String),一个是该属性的值(Object)
12.Session常用方法
创建和获取session(api一样)
HttpSession session = request.getSession();
第一次调用是创建Session会话,之后调用是获取创建好的Session对象
向session添加属性
session.setAttribute(String name,Object val);
从session得到某个属性
Object obj = session.getAttribute(String name);
从session删除某个属性
session.removeAttribute(String name);
isNew(); 判断是不是刚创建出来的Session
每个Session都有一个唯一标识的Id值(即JSESSIONID),通过getId()得到Session的会话Id值
13.Session底层实现机制
13.1原理分析图


整个过程如下:
一个浏览器向服务器发送请求,要操作session时,一定会调用request.getSession()方法。
- 这个方法会先判断浏览器是否携带了JSESSIONID的cookie:
- 如果没有携带,就会在服务器内存中创建一个session对象,并且为这个session分配一个sessionId。如上图,可以理解为服务器内存有一个map<String,Object>,sessionId作为map的key,session对象作为key关联的value。如此,这个sessionId就和该session对象关联起来了。
- 如果携带了,就会进一步判断:判断服务端的map中是否已经存在了该JSESSIONID对应的session对象
- 如果map中没有,就会创建一个session对象,并且为这个session分配一个新的sessionId。
- 如果map中已经存在了该JSESSIONID对应的session对象,就直接操作。
如果服务器在本次会话中,创建了session,则在响应头中将以Set-Cookie:JSESSIONID=xxxx的形式返回一个cookie给浏览器保存。下一次浏览器发送请求时,服务器就可以拿到cookie中的JSESSIONID的值,在map中找到该浏览器对应的session,直接操作。
这里的map可以理解为在Tomcat中还维护了一个容器HashMap<String,HttpSession>,这个容器中以JSESSIONID为key,以session为value,完成两者的绑定。
13.2代码演示
演示Session底层实现机制-创建和读取Session
13.2.1创建session的实例分析
web.xml:
<servlet>
<servlet-name>CreateSession</servlet-name>
<servlet-class>com.li.session.CreateSession</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CreateSession</servlet-name>
<url-pattern>/createSession</url-pattern>
</servlet-mapping>
CreateSession:
package com.li.session;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;
public class CreateSession extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//System.out.println("CreateSession doPost被调用...");
//1.获取session(同时也可能创建session)
HttpSession session = request.getSession();//注意这个地方已经把sessionId分配了
//2.给session获取id
System.out.println("当前sessionid= " + session.getId());
//3.给session存放一些数据
session.setAttribute("email", "zs@qq.com");
//4.给浏览器发送一个回复
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
writer.print("<h1>创建/操作session成功...</h1>");
writer.flush();
writer.close();
}
}
首先访问
http://localhost:8080/cs/createSession:
抓包显示:

走的是如下流程:

服务器后端显示:

此时浏览器存储的JSESSIONID变成了新的值:

此时,如果再次访问服务器,就会携带cookie中新的jsessionid给服务器,服务器不再返回jsessionid。

走的是如下流程:

如果redeployTomcat,关闭浏览器并重新打开,直接访问
http://localhost:8080/cs/createSession,这时候的请求头将不会携带jsessionid(因为关闭浏览器时默认删除了cookie),服务器返回的响应头将会携带一个jsessionid(因为重新发布tomcat,会清空服务器内存,这时请求的资源createSession程序会创建一个session,因此服务器会返回一个与之关联的jsessionid)这时候走的就是如下流程:

13.2.2读取session的实例分析
web.xml:
<servlet>
<servlet-name>ReadSession</servlet-name>
<servlet-class>com.li.session.ReadSession</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ReadSession</servlet-name>
<url-pattern>/readSession</url-pattern>
</servlet-mapping>
ReadSession:
package com.li.session;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;
public class ReadSession extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//System.out.println("ReadSession doPost被调用...");
//演示读取session
//1.获取session,如果没有session也会创建
HttpSession session = request.getSession();
//2.给session获取id
System.out.println("ReadSession 当前sessionid= " + session.getId());
//3.读取属性
Object email = session.getAttribute("email");
if (email != null) {
System.out.println("session属性 email= " + (String) email);
} else {
System.out.println("session中没有 email属性");
}
//3.给浏览器发送一个回复
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
writer.print("<h1>读取session成功...</h1>");
writer.flush();
writer.close();
}
}
redeployTomcat,首先在浏览器中访问
http://localhost:8080/cs/createSession(目的是创建一个和浏览器关联的session,因为redeployTomcat会删除服务器的session)然后访问
http://localhost:8080/cs/readSession,并抓包:
在服务器后台输出如下:第一行输出是我们创建session时获取的sessionid,第二行是我们读取session时获取的sessionid,并获取其属性。

14.Session生命周期
public void setMaxInactiveInterval(int interval):设置session的超时时间(以秒为单位),超过指定的时长,session就会被销毁。值为正数的时候,设置session的超时时长。
值为负数时,表示永不超时
public int getMaxInactiveInterval()表示获取session的超时时间public void invalidate()表示让当前的session会话立即无效如果没有调用
setMaxInactiveInterval(int interval)来指定session的生命时长,Tomcat会以session的默认时长为准,session的默认时长为30分钟,可以在tomcat目录的conf目录下的web.xml中设置。
Session的生命周期指的是:客户端两次请求的最大间隔时长,而不是累积时长。即当客户端访问了自己的session,session的生命周期将将从0开始重新计算。(指的是同一个会话两次请求之间的间隔时间)
cookie的生命周期指的是累积时长
底层:Tomcat用一个线程来轮询会话状态,如果某个会话的空闲时间超过设定的最大值,则将该会话销毁。
day21-web开发会话技术03的更多相关文章
- java web Session会话技术(原理图解+功能+与Cookie的区别+基本使用)
java web Session会话技术(原理图解+功能+与Cookie的区别+基本使用) 这是我关于会话技术的第二篇文章,对 Cookie有不了解的兄弟可以点击下方的Cookie跳转 Cookie链 ...
- Java Web之会话技术
客户端与服务器通信过程中,会产生一些数据.比如,A和B分别登陆了某宝购物网站,A买了一个Android手机,B买了一个iPhone手机,当结账时,web服务器需要分别对用户A和B的信息分别保存.根据J ...
- Web开发相关笔记 #03#
HTTP Status 500 ※ jsp 放在 WEB-INF 外面 ※ 使用 JDBC 时需要 close 什么 ※ execute 和 executeUpdate ※ How can I ...
- .NET Web开发技术简单整理
在最初学习一些编程语言.一些编程技术的时候,做的更多的是如何使用该技术,如何更好的使用该技术解决问题,而没有去关注它的相关性.关注它的理论支持,这种学习技术的方式是短平快.其实工作中有时候也是这样,公 ...
- Web开发技术发展历史
Web开发技术发展历史 来自:天码营 原文:http://www.tianmaying.com/tutorial/web-history Web的诞生 提到Web,不得不提一个词就是"互 ...
- 转载:.NET Web开发技术简单整理
在最初学习一些编程语言.一些编程技术的时候,做的更多的是如何使用该技术,如何更好的使用该技术解决问题,而没有去关注它的相关性.关注它的理论支持,这种学习技术的方式是短平快.其实工作中有时候也是这样,公 ...
- .NET Web开发技术简单整理 转
.NET Web开发技术简单整理 原文:http://www.cnblogs.com/SanMaoSpace/p/3157293.html 在最初学习一些编程语言.一些编程技术的时候,做的更多的是如何 ...
- 【转载】Web开发技术发展历史-版本1
原文在这里. Web开发技术发展历史 Web的诞生 提到Web,不得不提一个词就是“互联网”.Web是World Wide Web的简称,中文译为万维网.“万维网”和我们经常说的“互联网”是两个联系极 ...
- Web开发技术---简单的登录验证
制作一个APP或系统最基础的是登录界面,下面通过一个简单的登录注册界面的程序,来熟练掌握Web开发的技术. 一.知识点: 1.在网页界面获取用户的输入信息 2.标签的基本应用 3.用户输入结果的错误提 ...
- Web 建站技术中,HTML、HTML5、XHTML、CSS、SQL、JavaScript、PHP、ASP.NET、Web Services 是什么(转)
Web 建站技术中,HTML.HTML5.XHTML.CSS.SQL.JavaScript.PHP.ASP.NET.Web Services 是什么?修改 建站有很多技术,如 HTML.HTML5.X ...
随机推荐
- torch.meshgrid
1:https://blog.csdn.net/weixin_39504171/article/details/106356977 2: https://pytorch.org/docs/stable ...
- FileInputStream字节输入流
FileInputStream字节输入流 编码思想:首相顶一个FileInputStream字节输入流对象,fis设置为nul,在try/catch里面放入FileInputStream字节输入流对象 ...
- 【2022-09-09】Django框架(九)
Django框架(九) cookie与session简介 网址的发展史: 1.起初网站都没有保存用户功能的需求,所有用户访问返回的结果都是一样的. 比如:新闻网页,博客网页,小说... (这些网页是不 ...
- haodoop企业优化
MapReduce 跑的慢的原因 MapReduce程序效率的瓶颈在于两点 计算机性能 CPU,内存,磁盘健康,网络 I/O操作优化 数据倾斜 Map和Reduce数设置不合理 Map运行时间太长,导 ...
- k8s实际操作中的小知识点
1.批量执行yaml文件 # 把所有要执行的yaml文件放在同一个目录下,并且切换到这个目录下 kubectl apply -f . 2.利用pod的亲和和反亲和功能把pod调度到不同的node上 亲 ...
- 四、frp内网穿透服务端frps.ini各配置参数详解
[必须]标识头[common]是不可或缺的部分 [必须]服务器IPbind_addr = 0.0.0.00.0.0.0为服务器全局所有IP可用,假如你的服务器有多个IP则可以这样做,或者填写为指定其中 ...
- logstash知识点
Logstash是位于Data和Elasticsearch之间的一个中间件.Logstash是一个功能强大的工具,可与各种部署集成. 它提供了大量插件. 它从数据源实时地把数据进行采集,可帮助您解析, ...
- 监控MySQL运行状态:MySQLD Exporter
具体监控配置详看这篇文章:https://www.cnblogs.com/sanduzxcvbnm/p/13094580.html 为了确保数据库的稳定运行,通常会关注一下四个与性能和资源利用率相关的 ...
- loam详细代码解析与公式推导
loam详细代码解析与公式推导(基础理论知识) 一.基础坐标变换 loam中欧拉角解算都采用R P Y 的解算方式,即先左乘R, 再左乘P, 最后左乘Y,用矩阵表示为: R = Ry * Rp * R ...
- .NET 反向代理 YARP 代理 GRPC
前面的 YARP 文档中,介绍了怎么去代理 http,和如何根据域名转发,而在现在微服务的应用是越来越来多了,服务间的调用依靠 http 越来越不现实了,因为 http 多次握手的耗时越发的影响应用的 ...