位置: IT常识 - 正文

day21-web开发会话技术03(web开发百度百科)

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

推荐整理分享day21-web开发会话技术03(web开发百度百科),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:web开发百度百科,web开发流程和方法,web 开发,web 开发,web开发实例,web开发流程和方法,web 开发,web 开发,内容如对您有帮助,希望把文章链接给更多的朋友!

问题引出

不同的用户登录网站后,不管该用户浏览网站的哪个页面,都可以显示登录人的名字,还可以随时去查看自己购物车中的商品,这是如何实现的呢?也就是说,一个用户在浏览一个网站的不同页面时,服务器是如何知道是张三在浏览这个页面,还是李四在浏览这个页面?

解决方法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>day21-web开发会话技术03(web开发百度百科)

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用一个线程来轮询会话状态,如果某个会话的空闲时间超过设定的最大值,则将该会话销毁。

本文链接地址:https://www.jiuchutong.com/zhishi/311756.html 转载请保留说明!

上一篇:PHPCMS如何禁止IP访问网站(phpcms v9网页禁止复制)

下一篇:织梦dedecms动态跳转修改为静态url地址(织梦如何添加浮动广告)

  • 营销就要敢想、敢试、敢做!三大策略助你玩转营销(敢于营销)

    营销就要敢想、敢试、敢做!三大策略助你玩转营销(敢于营销)

  • 华为平板语音助手怎么唤醒(华为平板语音助手怎么开启)

    华为平板语音助手怎么唤醒(华为平板语音助手怎么开启)

  • 小米11无字模式怎么设置(小米无字模式下载)

    小米11无字模式怎么设置(小米无字模式下载)

  • 小米手环支付宝付款能离开手机使用吗(小米手环支付宝的二维码和条形码区别)

    小米手环支付宝付款能离开手机使用吗(小米手环支付宝的二维码和条形码区别)

  • 小米账号退出不了(小米账号退出不了可以刷机吗)

    小米账号退出不了(小米账号退出不了可以刷机吗)

  • 手机bl全称(手机bl啥意思)

    手机bl全称(手机bl啥意思)

  • 苹果a11处理器相当于麒麟多少(苹果a11处理器相当于天机多少)

    苹果a11处理器相当于麒麟多少(苹果a11处理器相当于天机多少)

  • 荣耀9x带不带遥控器功能(华为荣耀9x有没有智能遥控器)

    荣耀9x带不带遥控器功能(华为荣耀9x有没有智能遥控器)

  • 简述光纤和光缆的区别(简述光纤和光缆的优缺点)

    简述光纤和光缆的区别(简述光纤和光缆的优缺点)

  • 剪映找不到相册照片(剪映找不到相册怎么办)

    剪映找不到相册照片(剪映找不到相册怎么办)

  • ivvi p60用的什么处理器(ivvi p60-x12)

    ivvi p60用的什么处理器(ivvi p60-x12)

  • 京东自营催单有什么用(京东的催单)

    京东自营催单有什么用(京东的催单)

  • 怎么取消微信绑的手机号(怎么取消微信绑定的第三方应用)

    怎么取消微信绑的手机号(怎么取消微信绑定的第三方应用)

  • 苹果x隐藏功能4大功能(苹果x隐藏功能大全)

    苹果x隐藏功能4大功能(苹果x隐藏功能大全)

  • b站黑名单在哪里看(b站黑名单在哪看 哔哩哔哩黑名单查询方法)

    b站黑名单在哪里看(b站黑名单在哪看 哔哩哔哩黑名单查询方法)

  • 微信对方已删除账号是什么意思(微信对方已删除好友)

    微信对方已删除账号是什么意思(微信对方已删除好友)

  • 爱奇艺视频没有弹幕功能了怎么办(爱奇艺视频没有声音怎么办)

    爱奇艺视频没有弹幕功能了怎么办(爱奇艺视频没有声音怎么办)

  • 怎么下载网页中的视频(怎么下载网页中的文件)

    怎么下载网页中的视频(怎么下载网页中的文件)

  • iphone4手机铃声怎么设置(iphone4的铃声)

    iphone4手机铃声怎么设置(iphone4的铃声)

  • 手机刷机后内置的软件怎么卸载(手机刷机后内置卡怎么办)

    手机刷机后内置的软件怎么卸载(手机刷机后内置卡怎么办)

  • 拼多多月卡怎么停止续费(拼多多月卡怎么取消自动续费)

    拼多多月卡怎么停止续费(拼多多月卡怎么取消自动续费)

  • win10怎么整理磁盘(w10怎么磁盘整理)

    win10怎么整理磁盘(w10怎么磁盘整理)

  • oppor9s不显示通话记录(oppo电话进来不显示电话界面)

    oppor9s不显示通话记录(oppo电话进来不显示电话界面)

  • 快手小黄车打不开链接(快手小黄车打不开怎么办)

    快手小黄车打不开链接(快手小黄车打不开怎么办)

  • word中mathtype怎么用(word中mathtype怎么关闭)

    word中mathtype怎么用(word中mathtype怎么关闭)

  • OPPO手机桌面时钟怎么设置(oppo手机桌面时间不见了怎么恢复)

    OPPO手机桌面时钟怎么设置(oppo手机桌面时间不见了怎么恢复)

  • win10护眼模式在哪里? win10护眼模式的使用方法(win10护眼模式在哪)

    win10护眼模式在哪里? win10护眼模式的使用方法(win10护眼模式在哪)

  • partx命令  显示内核磁盘上分区情况(parted命令详解)

    partx命令 显示内核磁盘上分区情况(parted命令详解)

  • JavaWeb之Servlet

    JavaWeb之Servlet

  • 财务会计和预算会计是两套账吗
  • 用友取消操作在哪里
  • 企业所得税营业收入是含税还是不含税
  • 微型企业政府补贴政策
  • 固定资产清理属于什么科目
  • 车船税滞纳
  • 新办企业能否享受留抵退税
  • 预付费卡税务处理
  • 社保扣款上月没扣本月如何做会计处理?
  • 雇主责任险为什么不能立即生效
  • 挂靠费如何纳税?
  • 变更财务负责人在网上变更流程
  • 加油费发票7月1日开具
  • 旅游业是一个怎样的产业
  • 旅游合同签订
  • 土地计入无形资产包括的税费
  • 企业的对公支出是什么
  • 企业取得的土地使用权应作为固定资产核算
  • 稽查查补是什么意思
  • 插值法求利率计算公式
  • 建筑服务简易征收可以开专票吗
  • 小规模纳税人如何申报增值税
  • 交城建税的滞纳金是多少
  • 付款保险费
  • linux怎么用微信
  • 给实习生发放工资怎么纳税?
  • yolov5 c
  • antd-vue-pro
  • php reference
  • phprestfulapi框架
  • 微信小程序web-view 添加悬浮按钮
  • 残保金所属期怎么写
  • 会计科目分类有几种方法
  • cssschool
  • 帝国cms使用手册
  • 保险佣金个人所得税怎么申报
  • 财务费用为负的意思
  • 上缴税金怎么算税额
  • 房地产股权转让涉及哪些税费
  • 织梦自适应代码怎么做
  • mysql的where语句优化
  • 出口退税转内销还是转免税好
  • 服装类发票可以抵扣哪些
  • 库存现金写三栏式明细账还是写现金日记账还是两个都写
  • 公司开普票和专票税率一样吗
  • 什么情况下需要做心脏造影
  • 防伪税控开票系统年费
  • 自用房地产转换为成本模式计量的投资性房地产
  • 项目支付预缴税额怎么算
  • 增值税专用发票开了有什么用
  • 农产品加计扣除10%进项税账务处理
  • 怎么开具
  • 会计信息质量特征哪个最重要
  • 原始凭证错误的更正方法
  • phpstorm配置php环境 mac os
  • sql server连接方式
  • windows10关闭usb端口
  • Windows 2008R2 HyperV下安装CentOS6,网卡无痛设置
  • ie11forwindows10
  • 如何去掉桌面图标的蓝底
  • mac怎么批量删除qq好友
  • win10累积更新是什么意思
  • java.exe是指
  • win7系统c盘占用空间大
  • win7系统安装程序无法启动
  • 系统映像不存在怎么重装系统
  • opengl纹理叠加
  • cocos2dx视频教程
  • javascript HTML5 canvas实现打砖块游戏
  • vue 瀑布流
  • python 数独破解器
  • meta-inf文件夹在哪
  • jQuery插件是什么
  • js面向对象是什么意思
  • python环境及基础语法
  • js无限极分类
  • 供电局发票是什么样子的
  • 买楼送地下室划算吗
  • 新加坡税务局电邮
  • 个人扣缴客户端怎样迁移信息
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设