Session详解(重点)

news/2024/5/19 22:26:13/

类似于去服务器注册账号,只要服务器不停机,自己注册的账号一直会存在服务器。

什么是Session:

1.服务器会给每一个用户(浏览器)创建一个对象;

2.一个Session独占一个浏览器,只要浏览器没有关闭,这个session就会存在;

3.用户登录之后,整个网站它都可以访问!--->保存用户的信息;

 //session在创建的时候,做了什么事情?
//        Cookie cookie = new Cookie("JSESSIONID", id);
//        resp.addCookie(cookie);

其实

session服务器端

cookie客户端

Session可以存对象

存放对象 

package com.kuang.servlet;import com.kuang.pojo.Persion;import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;public class SessionDemo01 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//解决中文乱码问题req.setCharacterEncoding("utf-8");resp.setCharacterEncoding("utf-8");//解决浏览器中文乱码问题resp.setHeader("Content-type","text/html;charset=utf-8");//得到session对象HttpSession session = req.getSession();//给Session中存东西session.setAttribute("name",new Persion("鸡哥",3));//获取Session的IDString id = session.getId();System.out.println("您的sessionID为:"+id);//判断Session是不是新创建的if (session.isNew()){resp.getWriter().write("session创建成功,sessionID为:"+id);}else {resp.getWriter().write("session已经在服务器中存在了,sessionID为:"+id);}//session在创建的时候,做了什么事情?
//        Cookie cookie = new Cookie("JSESSIONID", id);
//        resp.addCookie(cookie);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}

 

取对象 

package com.kuang.servlet;import com.kuang.pojo.Persion;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;public class SessionDemo02 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//解决中文乱码问题req.setCharacterEncoding("utf-8");resp.setCharacterEncoding("utf-8");//解决浏览器中文乱码问题resp.setHeader("Content-type","text/html;charset=utf-8");//得到session对象HttpSession session = req.getSession();//获得session的name属性Persion persion = (Persion)session.getAttribute("name");System.out.println(persion.toString());}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}

实体类 

package com.kuang.pojo;import java.util.Objects;public class Persion {String name;int age;public Persion(String name, int age) {this.name = name;this.age = age;}public Persion() {}@Overridepublic String toString() {return "Persion{" +"name='" + name + '\'' +", age=" + age +'}';}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}

终于理解到为什么每次s1是session已经存在了,因为每次项目启动连接到服务端8080页面就创建了session,你在去访问是s1自然是已存在面

注销Session

我这里面注销了之后没有报空指针,只是取person取出来个null

报错的是System.out.println(name);空指针,但是再注销的时候,访问S2会立即生成新的Session

package com.kuang.servlet;import com.kuang.pojo.Persion;import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;public class SessionDemo01 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//解决中文乱码问题req.setCharacterEncoding("utf-8");resp.setCharacterEncoding("utf-8");//解决浏览器中文乱码问题resp.setHeader("Content-type","text/html;charset=utf-8");//得到session对象HttpSession session = req.getSession();//给Session中存东西session.setAttribute("name",new Persion("鸡哥",3));//获取Session的IDString id = session.getId();System.out.println("您的sessionID为:"+id);//判断Session是不是新创建的if (session.isNew()){resp.getWriter().write("session创建成功,sessionID为:"+id);}else {resp.getWriter().write("session已经在服务器中存在了,sessionID为:"+id);}//session在创建的时候,做了什么事情?
//        Cookie cookie = new Cookie("JSESSIONID", id);
//        resp.addCookie(cookie);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}

 

package com.kuang.servlet;import com.kuang.pojo.Persion;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;public class SessionDemo02 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//解决中文乱码问题req.setCharacterEncoding("utf-8");resp.setCharacterEncoding("utf-8");//解决浏览器中文乱码问题resp.setHeader("Content-type","text/html;charset=utf-8");//得到session对象HttpSession session = req.getSession();//获得session的name属性Persion persion = (Persion)session.getAttribute("name");resp.getWriter().write(session.getId());}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}

注销 

package com.kuang.servlet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
//注销Session
public class SessionDemo03 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//老三要素req.setCharacterEncoding("utf-8");resp.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");//获得session对象HttpSession session = req.getSession();session.removeAttribute("name");session.invalidate();}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}

Session 和 Cookie的区别

1.Cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)

2.Session 把用户的数据写到用户独占Session中,服务器端保存(保存重要的信息,减少服务器的浪费)

3.Session对象由服务器创建!

 

 服务器在产生一个cookie,cookie的name是sessionid,值sessionid

 

自我理解

Session:就是服务器存东西,想宝库一样,它会发放给每一个用户一个Sessionid(使用cookie发放给客户端,也就是存放在浏览器上),这就相当于一把钥匙,用户可以通过它取得宝库里的所有属于它的东西。

cookie:就是来做客,给你发的小饼干,这个饼干的东西,就是服务器给的一个数据,这个数据只能存字符串,(而session可以存对象),表示你来过,下次请求服务器的时候,带着cookie来,服务器就知道你上一次来过了!

servletContext是所有用户共用一个,session是每个人一个

中间会有一层中间商,这个的话是个悬念,后面会换一个名字出现ApplicationContext

 


http://www.ppmy.cn/news/46951.html

相关文章

***大论文中插入Visio不失真方法:word插入viso图片方法

***大论文中插入Visio不失真方法:word插入viso图片方法 1、可以直接导出emf2、如果利用emf导致字符间距过大,可以选择下面方式 1、可以直接导出emf 导出emf方法: 打开visio --> 另存为 --> 选择emf格式文件 打开word --> 插入图片…

[API]ListList方法集合排序Lambda表达式(四)

List接口: 继承自Collection接口,List集合是可重复集合,并且有序,还提供了一套可以通过下标来操作元素的方法 常见的实现类: ArrayList:内部使用数组实现,查询性能更好(直接下标找到物理地址)、…

开源GPT-4小羊驼(Vicuna)快速上手指南

小羊驼(Vicuna)是什么 Vicuna: 一个开源的GPT,宣称实现了GPT-4 90%的功能。 UC伯克利学者联手CMU、斯坦福等,再次推出一个全新模型70亿/130亿参数的Vicuna,俗称「小羊驼」(骆马)。 并且和其他以往不同的是…

2023红明谷杯部分WP

0x00 签到 一直点就能得到flag 0x01 Dreamer 拿到题感觉有点儿懵 先下发靶机看一眼 梦想家CMS,好嘛,我直接一手查找官网 直接一手演示中心碰运气 哎嘿嘿,运气不错进去了,突然想起之前有位大佬写的关于Dreamer CMS的代码审…

基于ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升环境、生态、水文、土地、土壤、农业、大气等领域的数据分析能力与项目科研水平

【原文链接】:基于ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升环境、生态、水文、土壤、农业、大气等领域的数据分析https://mp.weixin.qq.com/s?__bizMzU5NTkyMzcxNw&mid2247537467&idx4&sn10c4c12897282daf5320efae05caf3a4&chksmfe689551…

​​2021遥感应用组二等奖:基于机器学习回归算法的鄱阳湖水质遥感定量反演及时序变化监测研究

作品介绍 一、作品背景 鄱阳湖是中国第一大淡水湖,也是中国第二大湖,它在调节长江水位、涵养水源、改善当地气候等方面起着重大的作用。但近年来受围垦、环境污染等人类活动影响,鄱阳湖湿地退化严重,同时使鄱阳湖的容量减少&…

Kafka的历史版本对应SpringBoot版本

截至目前(2023年),Kafka的最新版本是2.9.0,发布于2022年11月30日。Kafka的历史版本可以在Kafka官方网站的下载页面中找到。Kafka从0.8版本开始发布,经历了多个版本的迭代和升级。以下是一些比较重要的Kafka版本及其发布…

US News退榜风波后,发布最新美国最佳法学院和医学院排名

从2022年11月开始,美国权威排名机构US News不断陷入风波。耶鲁大学法学院率先宣布退出US News法学院排名,先是法学院,后是医学院,包括哈佛大学大学、斯坦福大学、哥伦比亚大学和加州大学伯克利分校等名校也纷纷宣布退出。 这些老…

The 1st Universal Cup Stage 12: ̄Ookayama, April 15-16, 2023 题解

A XOR Tree Path 给一颗树&#xff0c;树上点有黑白两色&#xff0c;每次可以选一个叶子节点&#xff0c;翻转其到根路径上所有点的颜色&#xff0c;问最大黑色点数。 树dp #include<bits/stdc.h> using namespace std; #define MAXN (10000010) #define ll long long…

【社区图书馆】启迪后人——GPT 与读书的奇妙之旅

随着科技的发展和人工智能的不断进步&#xff0c;我们的阅读方式也在逐渐改变。作为一个热爱读书的人&#xff0c;我深感好奇与惊讶地发现&#xff0c;GPT&#xff08;即生成预训练 Transformer&#xff09;正以前所未有的方式拓展我们的阅读视野。在这篇博客中&#xff0c;我将…

RabbitMQ-整合mqtt

用 springboot rabbitmq可以搭建物联网&#xff08;IOT&#xff09;平台&#xff0c;rabbitmq 不是消息队列吗&#xff0c;原来rabbitmq有两种协议&#xff0c;消息队列是用的AMQP协议&#xff0c;而用在智能硬件中的是MQTT协议。 一、rabbitmq是什么&#xff1f; RabbitMQ就…

Windows 自带环境变量

目录 Windows自带环境变量说明Windows自带环境变量总结 所谓 Windows 环境变量&#xff0c;指的是 Windows 指定操作系统工作环境的一些设置选项或属性参数&#xff0c;比方说指定系统文件夹或临时文件夹的位置等。与常量相比&#xff0c;一个环境变量往往由变量名称和变量值组…

MySQL全局锁、表级锁、行级锁介绍演示(详细)

目录 介绍 分类 1、全局锁 1.1介绍 1.2场景 1.3语法 1.4演示 2、表级锁 2.1介绍 2.2分类 2.3语法 2.4演示 3、行级锁 3.1介绍 3.2分类 3.3场景 介绍 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#xff08;…

详解语义分割deeplabv3+模型的工业应用流程

来源&#xff1a;投稿 作者&#xff1a;某一个名字 编辑&#xff1a;学姐 导语 在工业视觉应用中&#xff0c;目标检测算法常用于特征的粗定位&#xff0c;而语义分割则在特征的精定位方面有着突出的表现。使用较多的语义分割模型主要有FCN、deeplab系列、unet等&#xff0c;根…

android framework-PackageManagerService(PKMS)包管理服务

一、概述 Android系统启动过程中&#xff0c;会启动一个包管理服务PackageManagerService(PKMS)&#xff0c;这个服务主要负责扫描系统中指定目录&#xff0c;找出里面以apk结尾的文件&#xff0c;通过对这些文件进行解析&#xff0c;得到应用程序的所有信息并完成应用程序的安…

【AI生产力工具】ChatPDF:将 PDF 文档转化为交互式阅读体验的利器

文章目录 简介一、ChatPDF 是什么&#xff1f;二、ChatPDF 的优势三、ChatPDF 的应用场景四、如何使用 ChatPDF&#xff1f;五、结语 简介 随着数字化时代的发展&#xff0c;PDF 文件已经成为了日常工作和学习中不可或缺的一部分。然而&#xff0c;仅仅将 PDF 文件上传或下载并…

【排序】快速排序(递归和非递归)

快速排序 前言图解大致思路对于hoare版本对于挖坑法对于前后指针法 实现方法递归非递归 快排的优化&#xff08;基于递归的优化&#xff09;三数取中法小区间优化 时间复杂度和空间复杂度 前言 快速排序&#xff0c;听名字就比较霸道&#xff0c;效率根名字一样&#xff0c;非…

理解C语言中的空指针和野指针

在C语言中&#xff0c;指针是一个非常重要的概念&#xff0c;可以用于操作变量和数据结构。但是&#xff0c;指针也是很容易出错的地方。其中包括两种可能的错误&#xff1a;空指针和野指针。 空指针 空指针指代无效的地址&#xff0c;表示指针不指向内存中的任何一个合法对象…

深入剖析:如何优化Android应用的性能和内存管理

深入剖析&#xff1a;如何优化Android应用的性能和内存管理 性能和内存管理的重要性 在今天的移动应用开发中&#xff0c;用户对于应用的性能和体验要求越来越高。一款性能卓越的Android应用能够提供流畅的操作体验、快速的响应速度以及较低的资源消耗&#xff0c;从而提高用户…

Android 11.0 设置默认DNS

1.前言 在11.0的系统rom产品定制化开发中,由于是wifi产品的定制,需要对wifi功能要求比较高,所以在wifi需求方面要求设置默认的dns功能,这就需要分析网络通讯 流程,然后在联网之后,设置默认的dns,来实现功能要求 2.设置默认DNS的核心类 frameworks\base\core\java\andr…