Session详解(重点)

news2024/12/29 7:43:36

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

什么是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 {
    @Override
    protected 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的ID
        String 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);
    }

    @Override
    protected 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 {
    @Override
    protected 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());
    }

    @Override
    protected 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() {
    }

    @Override
    public 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 {
    @Override
    protected 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的ID
        String 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);
    }

    @Override
    protected 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 {
    @Override
    protected 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());
    }

    @Override
    protected 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 {
    @Override
    protected 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();

    }

    @Override
    protected 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.coloradmin.cn/o/426105.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何高效清洗数据?试试这款神器

在大数据时代,数据的来源具有多样性、复杂性。 针对数量庞大、渠道及格式多样的数据,数据清洗就成为刚需。 在数据分析中,数据清洗实际上是十分繁重且关键的一步。 Power Query作为数据清洗的工具,能将这些多源的数据集中并统一…

优化城市布局:地下管网解决方案的应用

城市地下管网是城市基础设施中非常重要的一部分,包括排水系统、供水系统、天然气管道、电缆管道等多种管网。然而,城市地下管网也是一个复杂而庞大的系统,由于年久失修和规划不当等原因,经常出现漏水、爆炸、停电等问题&#xff0…

【Unity入门】10.物体的运动

【Unity入门】物体的运动 大家好,我是Lampard~~ 欢迎来到Unity入门系列博客,所学知识来自B站阿发老师~感谢 (一)用脚本驱动物体移动 (1)制作一台运动的小车 回顾上一篇文章,我们已经可以用脚本…

Allegro thermal relief热风焊盘

为了画个通孔焊盘,看了很久的 Thermal relief相关的内容,终于基本上理解了。记录一下。 这篇文章讲得非常清楚: 深入理解Allegro之Thermal Relief与Anti Pad - 百度文库 (baidu.com) 热风焊盘般用在内层,减少一些焊盘和铜皮的连…

某vm样本的分析

背景 驱动那块(MiDeadPteTrackerSListHead) 从遥远的东方收到的一个样本,好嘛!打开之后一直不停的在创建和结束进程,又是vmp。 还是老方法,dmp下来之后看看,好嘛,main函数被vm了&am…

大数据技术之Hive

第1章Hive基本概念1.1 Hive1.1.1 Hive的产生背景在那一年的大数据开源社区,我们有了HDFS来存储海量数据、MapReduce来对海量数据进行分布式并行计算、Yarn来实现资源管理和作业调度。但是面对海量数据和负责的业务逻辑,开发人员要编写MR来对数据进行统计…

stm32学习第四天

DMA1:各个通道一览 DMA2:各个通道一览 1.stm32DMA相关固件库函数说明 第一个参数选择哪一个DMA的哪一个通道 初始化函数 void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct); typedef struct {uint32_t DMA_Periph…

Vue项目中关于全局css的处理

Vue项目中关于全局css的处理步骤一:定义声明全局CSS的样式文件(common.scss)步骤二:挂载到全局封装一:对common.scss拆分封装二:新建index.scss,对elementPlus或者element-ui样式进行覆盖封装三:variable.s…

一、ts学习第一课:环境配置

一、下载node 官网:Node.jsNode.js is a JavaScript runtime built on Chromes V8 JavaScript engine.https://nodejs.org/en 推荐下载左侧稳点版的node,下载好了,就一步步点击安装就ok了。 判断是否已经下载好了node,在命令行…

BIO和NIO的区别与实现

目录 目标 概述 实战 单线程版本的BIO 多线程版本的BIO 单线程NIO(简易版) 单线程NIO(多路复用版) 客户端发送数据的方法 目标 了解BIO和NIO的区别和应用场景。分析BIO和NIO的线程模型,利用Socket实现BIO和NI…

pytorch 笔记

1.python文件、python控制台Terminal、jupyter代码执行比较 2.Dataset和Dataloader dataset存储数据集,dataloader从数据集中批量加载数据,如 把 dataset 放入 DataLoaderloader Data.DataLoader(datasettorch_dataset, # torch TensorDataset forma…

MIPI D-PHYv2.5笔记(17) -- Global Operation Flow Diagram、数据速率依赖参数

声明:作者是做嵌入式软件开发的,并非专业的硬件设计人员,笔记内容根据自己的经验和对协议的理解输出,肯定存在有些理解和翻译不到位的地方,有疑问请参考原始规范看 Global Operation Flow Diagram 图1 Data Lane Mod…

【Linux】线程概念详析

我们已经了解了Linux操作系统进程部分相关知识: 博主有关Linux进程相关介绍的文章: 💥[Linux] 系统进程相关概念、系统调用、Linux进程详析、进程查看、fork()初识 💥[Linux] 进程状态相关概念、Linux实际进程状态、进程优先级 …

【超算/先进计算学习】日报1

目录今日已完成任务列表遇到的问题及解决方案任务完成详细笔记Darknet框架优化介绍darknet介绍YOLO高性能计算与超级计算机简介算力超级计算机概念与体系结构并行编程技术Linux常用操作命令Linux操作系统与指令使用机器信息查询文件、目录和权限文件内容查看环境变量使用对自己…

15.枚举

枚举 枚举是Java1.5引入的新特性,通过关键字enum来定义枚举类。枚举类是一种特殊类,它和普通类一样可以使用构造方法、定义成员变量和方法,也能实现接口,但枚举类不能继承其他类。枚举是一个被命名的整型常数的集合,用于声明一组…

Linux系统下安装zookeeper教程

将下载好的zookeeper上传到linux服务器上,这里使用的是FileFilla 解压:[rootcentos7964 software]# tar -zxvf apache-zookeeper-3.7.1-bin.tar.gz 进入刚刚解压后的文件夹,创建一个名字为data的文件夹,如下: [rootc…

分库分表--shardingjdbc

文章目录前言一、shardingjdbc简介作用二、如何使用1.我有个表现在体量太大了,我想做分库分表2.开始改造1 引入shardingjdbc2 更改yml文件3 测试看效果3.旧数据迁移4.其他分库类型5 部分配置说明总结前言 当项目开始的时候,没有想到后续的分库分表的话,其实对于后续的分库分表…

MYSQL学习 - DDL数据库操作

前言 从今天开始, 健哥就带各位小伙伴学习数据库技术。数据库技术是Java开发中必不可少的一部分知识内容。也是非常重要的技术。本系列教程由浅入深, 全面讲解数据库体系。 非常适合零基础的小伙伴来学习。 ------------------------------前戏已做完,精彩即开始---…

【数据结构】树和二叉树——堆

目录 🍉一.树的概念及结构🍉 1.树的概念 2.树的相关术语 3.树的表示 4.树在实际中的应用 🍊二.二叉树的概念和结构🍊 1.二叉树的概念 2.特殊的二叉树 2.1.满二叉树 2..2.完全二叉树 3.二叉树的性质 4.二叉树的存储结构 …

限流算法(计数器、滑动时间窗口、漏斗、令牌)原理以及代码实现

文章目录前言1、计数器(固定时间窗口)算法原理代码实现存在的问题2、滑动时间窗口算法原理代码实现存在的问题3、漏桶算法原理代码实现存在的问题4、令牌桶算法原理代码实现最后本文会对这4个限流算法进行详细说明,并输出实现限流算法的代码示…