【JavaEE】_Spring MVC项目获取Session

news2025/2/27 20:47:17

目录

 1. 使用servlet原生方法获取Session

1.1 错误获取方法

1.2 正确获取方法

2. 使用Spring注解获取Session

3. 使用Spring内置对象获取Session


 1. 使用servlet原生方法获取Session

.java文件内容如下:

setSession方法用于设置Session对象的内容;

getSession方法用于获取Session对象的内容;

package com.example.demo.controller;

import com.example.demo.Person;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

@RequestMapping("/Para")
@RestController
public class ParaController {
    @RequestMapping("/setSession")
    public String setSession(HttpServletRequest request){
        HttpSession session = request.getSession();
        session.setAttribute("username", "zhangsan");
        return "Session set successfully";
    }
    @RequestMapping("/getSession")
    public String getSession(HttpServletRequest request){
        HttpSession session = request.getSession();
        if(session!=null){
            String username = (String) session.getAttribute("username");
            return "UserInformation: username is "+username;
        }
        return "Session is null";
    }
}

运行启动服务器,

1.1 错误获取方法

现试直接访问getSession:

发现并未设置session的内容;

1.2 正确获取方法

session是服务器的机制,无法伪造。需要在服务器端编写程序实现session的存取;

在本例中,setSession方法就是用于实现session的存取;

1. 首先访问setSession方法:

我们会发现在cookie列表中新增了一项名为JSESSIONID的cookie;

2. 使用Fiddler抓包查看HTTP请求与响应:

HTTP请求内容如下:

HTTP响应内容如下:

sessionId是连接cookie与session的桥梁,根据响应中的set-session报头实现客户端cookie的设置;

3. 此时再访问getSession方法:

可见session获取成功;

注:1. getSession方法可以携带一个布尔值的参数,表示在没有session时是否创建session:

默认情况下为true,表示当没有session时,创建一个session

2. session本质就是一个哈希表,其存储情况如下:

在服务器中对不同的客户端都会有session,getSession方法就是根据SessionId获取到Session对象;

2. 使用Spring注解获取Session

1. 可以使用Spring提供的注解@SessionAttribute获取Session

2. Session是服务器的机制,重启服务器后Session会丢失

.java内容如下:

package com.example.demo.controller;

import com.example.demo.Person;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

@RequestMapping("/Para")
@RestController
public class ParaController {
    @RequestMapping("/getSession2")
    public String getSession(@SessionAttribute String username){
        return "username: "+username;
    }
}

运行启动服务器,根据URL访问getSession2方法,页面如下:

查看服务器日志:

Ctrl+左键查看@SessionAttribute源码

手动设置为false即可,修改后的.java文件中getSession2方法如下:

    @RequestMapping("/getSession2")
    public String getSession(@SessionAttribute(required = false) String username){
        return "username: "+username;
    }

运行启动服务器,再次访问getSession2方法有:

再次访问上一例中setSession方法对session进行设置:

再次访问getSession2方法:

可见此时session获取成功;

3. 使用Spring内置对象获取Session

Spring内置了HttpSession对象,当方法参数为HttpSession session时,

等同于使用servlet原生方法中使用HttpSession session = request.getSession(true);

.java内容如下:

package com.example.demo.controller;

import com.example.demo.Person;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

@RequestMapping("/Para")
@RestController
public class ParaController {
    @RequestMapping("/getSession3")
    public String getSession(HttpSession session){
        String username = (String) session.getAttribute("username");
        return "UserInformation: username is "+username;
    }
}

运行启动服务器后,同上例,先运行setSession后,再访问getSession3,流程相同,不再赘述;

访问结果为:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1585197.html

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

相关文章

文件输入/输出流(I/O)

文章目录 前言一、文件输入\输出流是什么?二、使用方法 1.FileInputStream与FileOutputStream类2.FileReader与FileWriter类总结 前言 对于文章I/O(输入/输出流的概述),有了下文。这篇文章将具体详细展述如何向磁盘文件中输入数据,或者读取磁…

面试八股——数据库——事务

概述 事务的特性(ACID) 原子性:事务是不可分割的操作单元,要么全部成功,要么全部失败。 一致性:事务结束时,所有数据都必须保证一致状态。 隔离性:事务在独立环境运行,…

Burp Suite Professional 2024.3.1 for Windows x64 - 领先的 Web 渗透测试软件

Burp Suite Professional 2024.3.1 for Windows x64 - 领先的 Web 渗透测试软件 世界排名第一的 Web 渗透测试工具包 请访问原文链接:Burp Suite Professional 2024.3.1 for Windows x64 - 领先的 Web 渗透测试软件,查看最新版。原创作品,转…

OpenGL Assimp 加载3D模型介绍

OpenGL Assimp 加载3D模型介绍 Assimp对应模型结构体解说 所有的模型、场景数据都包含在scene对象中,如所有的材质和Mesh。同样,场景的根节点引用也包含在这个scene对象中 场景的Root node(根节点)可能也会包含很多子节点和一个…

微服务面试题一

1.SOA、分布式、微服务之间有什么关系和区别? 分布式架构是指将单体架构中的各个部分拆分,然后部署不同的机器或进程中去,SOA和微服务基 本上都是分布式架构的SOA是⼀种⾯向服务的架构,系统的所有服务都注册在总线上,…

“植物大战僵尸:机器学习引领游戏AI新革命“

上期回顾: 今天给大家推荐一个Gtihub开源项目:PythonPlantsVsZombies,翻译成中就是植物大战僵尸。 《植物大战僵尸》是一款极富策略性的小游戏。可怕的僵尸即将入侵,每种僵尸都有不同的特点,例如铁桶僵尸拥有极强的抗…

开源推荐榜【Casbin.NET 一个为.NET(C#)项目设计的高效且强大的访问控制库】

Casbin 是一个强大高效的开源访问控制库,支持各种 访问控制模型 , 如 ACL, RBAC, ABAC 等。 我们希望可以让指定的主体 subject,可以访问指定的资源 object,访问可以是读和写。这就是 Casbin 使用最广泛的方式。也称为 { subject, object, ac…

【MATLAB源码-第20期】基于matlab的短波通信多径信道仿真,多径数目为3,用QPSK来测试误码率效果输出误码率对比图。

1、算法描述 短波通信是一种使用短波频段的无线电通信技术,它具有以下特点: 1. 频段范围:短波通信通常使用3MHz到30MHz之间的频段。这个频段之所以称为“短波”,是因为它的波长相对较短,适合进行长距离通信。 2. 长距…

大语言模型的指令调优:综述

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 论文标题:Instruction Tuning for Large Language Models: A Survey 论文地址:https://arxiv.org/abs/2308.10792 指令调优是提升大语言模型(LLMs)性能…

前端招聘:几招识别注水简历,不懂技术也能挤出水分。

现在的前端开发市场鱼目混珠,尤其是某些培训机构经常鼓动学院美(造)化( 假)简历,搞得很多前端招聘经验缺乏,又急需用人单位公司损失不小,满以为找到合适的人员了,其实是频…

倍思和南卡开放式耳机哪个好?深度测评剖析实力王!

​开放式耳机凭借其新颖的佩戴设计和优秀的音质体验,正逐渐赢得越来越多消费者的喜爱。在众多品牌中,南卡、倍思等业界巨头推出的开放式耳机尤为引人注目。这些耳机是否真的名副其实?它们又有哪些特色和优缺点?为了解答这些问题&a…

Canal扩展篇

1.Canal介绍 Canal官网:https://github.com/alibaba/canal Canal 主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费,工作原理如下: Canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave &…

FPGA - 以太网UDP通信(一)

一,简述以太网 以太网简介 ​以太网是一种计算机局域网技术。IEEE组织的IEEE 802.3标准制定了以太网的技术标准,它规定了包括物理层的连线、电子信号和介质访问层协议的内容。 ​ 以太网类型介绍 以太网是现实世界中最普遍的一种计算机网络。以太网有…

流程图高亮跟踪 可自定义渲染图片

【流程跟踪】获取流程定义图 获取代码如下: ProcessDefinition processDefinition repositoryService.createProcessDefinitionQuery().processDefinitionKey("leave").singleResult();String diagramResourceName processDefinition.getDiagramResour…

恒流电源驱动惠斯通电桥输出电压计算

笔记 并联分流/串联分压贯穿始终 先通过式子计算每条路流经的电流大小 (1-(支路电阻)/(所有电阻) )* 电流源I 每条之路电流大小知道了。就可以知道每条路中间点输出 支路电流*电阻。 输出即:中间点输出电位差。同理可以通过阻值变化推…

力扣HOT100 - 240. 搜索二维矩阵 II

解题思路&#xff1a; 从左下角开始&#xff0c;根据条件删除行和列。 class Solution {public boolean searchMatrix(int[][] matrix, int target) {int row matrix.length - 1;int col matrix[0].length - 1;int l 0;while (row > 0 && l < col) {if (targ…

深入理解java虚拟机-类的生命周期-初始化阶段

针对P2的字节码解释&#xff1a; 操作数栈里面放1&#xff0c;然后对Demo1.value的static变量进行赋值操作&#xff0c;从栈里面拿1赋值给Demo1.value的static变量 P3的情况由于源码是把 public static int value 1; static {value 2; }颠倒为&#xff1a; static {value …

2024电力、电网与智能应用技术国际学术会议(ICPGIAT2024)

2024电力、电网与智能应用技术国际学术会议(ICPGIAT2024) 会议简介 2024年国际电力、电网和智能应用技术大会&#xff08;ICPGIAT 2024&#xff09;将在中国杭州举行&#xff0c;就“电力系统”、“智能控制”和“智能应用技术”等研究主题进行讨论和交流。会议围绕智能系统…

第十二届蓝桥杯大赛软件赛省赛Java 大学 B 组题解

1、ASC public class Main {public static void main(String[] args) {System.out.println(

药店药品进销存管理系统软件可以对有效期管理查询以及对批号库存管理

药店药品进销存管理系统软件可以对有效期管理查询以及对批号库存管理 一、前言 以下软件操作教程以&#xff0c;佳易王药店药品进销存管理软件为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 软件可以对药品有效期进行管理查询&#xff0c;可以…