首页 > 编程语言 >详解Java之Spring MVC篇二

详解Java之Spring MVC篇二

时间:2024-11-08 12:16:31浏览次数:7  
标签:Java name Session Spring 获取 MVC Cookie 服务器 String

目录

获取Cookie/Session

理解Cookie

理解Session

Cookie和Session的区别

获取Cookie

获取Session

获取Header

获取User-Agent


获取Cookie/Session
理解Cookie

HTTP协议自身是“无状态”协议,但是在实际开发中,我们很多时候是需要知道请求之间的关联关系的。

上述图中的 "令牌" 通常就存储在 Cookie 字段中.
此时在服务器这边就需要记录"令牌"信息, 以及令牌对应的⽤⼾信息, 这个就是 Session 机制所做的⼯作.

理解Session

我们先来了解⼀下什么是会话.
会话: 对话的意思

在计算机领域, 会话是⼀个客⼾与服务器之间的不中断的请求响应. 对客⼾的每个请求,服务器能够识别出请求来⾃于同⼀个客⼾. 当⼀个未知的客⼾向Web应⽤程序发送第⼀个请求时就开始了⼀个会话.
当客⼾明确结束会话或服务器在⼀个时限内没有接受到客⼾的任何请求时,会话就结束了.
服务器同⼀时刻收到的请求是很多的. 服务器需要清楚的区分每个请求是从属于哪个⽤⼾, 也就是属于哪个会话, 就需要在服务器这边记录每个会话以及与⽤⼾的信息的对应关系.

Session是服务器为了保存⽤⼾信息⽽创建的⼀个特殊的对象.

Session的本质就是⼀个 "哈希表", 存储了⼀些键值对结构. Key 就是SessionID, Value 就是⽤⼾信息(⽤⼾信息可以根据需求灵活设计).

SessionId是由服务器⽣成的⼀个 "唯⼀性字符串", 从 Session 机制的⻆度来看, 这个唯⼀性字符串称为 "SessionId". 但是站在整个登录流程中看待, 也可以把这个唯⼀性字符串称为 "token".
上述例⼦中的令牌ID, 就可以看做是SessionId, 只不过令牌除了ID之外, 还会带⼀些其他信息, ⽐如时间, 签名等.

1. 当⽤⼾登陆的时候, 服务器在 Session 中新增⼀个新记录, 并把 sessionId返回给客⼾端. (通过HTTP 响应中的 Set-Cookie 字段返回).
2. 客⼾端后续再给服务器发送请求的时候, 需要在请求中带上 sessionId. (通过 HTTP 请求中的Cookie 字段带上).
3. 服务器收到请求之后, 根据请求中的 sessionId在 Session 信息中获取到对应的⽤⼾信息, 再进⾏后续操作.找不到则重新创建Session, 并把SessionID返回.

Session 默认是保存在内存中的. 如果重启服务器则 Session 数据就会丢失.

Cookie和Session的区别

• Cookie 是客⼾端保存⽤⼾信息的⼀种机制. Session 是服务器端保存⽤⼾信息的⼀种机制.
• Cookie 和 Session之间主要是通过 SessionId 关联起来的, SessionId 是 Cookie 和 Session 之间的桥梁
• Cookie 和 Session 经常会在⼀起配合使⽤. 但是不是必须配合.
• 完全可以⽤ Cookie 来保存⼀些数据在客⼾端. 这些数据不⼀定是⽤⼾⾝份信息, 也不⼀定是
SessionId
• Session 中的sessionId 也不需要⾮得通过 Cookie/Set-Cookie 传递, ⽐如通过URL传递.

1. 存储位置
Cookie:存储在客户端(浏览器)上。当服务器响应一个HTTP请求时,它可以在响应头中包含一个Set-Cookie字段,浏览器会保存这个Cookie,并在后续的请求中通过Cookie请求头将Cookie发送回服务器。
Session:存储在服务器端。服务器为每个用户会话创建一个唯一的标识符(通常是Session ID),这个标识符被发送到客户端(通常是通过Cookie,但也可以通过URL重写等方式),客户端在后续的请求中携带这个标识符,服务器通过这个标识符来识别用户会话。
2. 安全性
Cookie:由于存储在客户端,因此相对容易受到攻击,如跨站脚本攻击(XSS)可以读取或修改Cookie。但是,可以通过设置HttpOnly和Secure标志来增加安全性,HttpOnly标志可以防止JavaScript访问Cookie,Secure标志则要求Cookie仅通过HTTPS发送。
Session:存储在服务器端,因此相对更安全。但是,如果Session ID被泄露(例如,通过URL重写并泄露在日志中),则可能面临会话劫持的风险。
3. 容量限制
Cookie:由于存储在客户端,其大小受到浏览器和服务器设置的限制。大多数浏览器对每个Cookie的大小和每个域名下的Cookie总数都有限制。
Session:存储在服务器端,因此其大小限制主要取决于服务器的内存和配置,通常远大于Cookie的限制。
4. 生命周期
Cookie:可以设置过期时间(Expires/Max-Age),也可以不设置(会话Cookie,浏览器关闭时失效)。
Session:通常依赖于服务器端的配置和Session的存储方式(如内存、数据库等)。如果服务器配置了Session的超时时间,则Session在达到超时时间后会被销毁。
5. 使用场景
Cookie:适用于存储少量数据,如用户偏好设置、登录状态等。由于存储在客户端,可以跨多个页面和请求持久化数据。
Session:适用于存储大量数据,如用户信息、购物车内容等。由于存储在服务器端,可以更安全地管理用户会话。

获取Cookie

首先先设置Cookie

再获取:

    @RequestMapping("/getC")
    public String getCookie(HttpServletRequest request){
        //获取参数
//        String name = request.getParameter("name");
        Cookie[] cookies = request.getCookies();
        if (cookies!=null){
            Arrays.stream(cookies).forEach(ck -> System.out.println(ck.getName()+":"+ck.getValue()));
        }
        return "获取Cookie";
    }

更为简洁的代码:

@RequestMapping("/getC2")
public String getCookie2(@CookieValue("name") String name){
    return "从Cookie中获取值, name:"+name;
}
获取Session

Session是服务器端的机制, 我们需要先存储, 才能再获取.
Session 也是基于HttpServletRequest 来存储和获取的.

设置Session

    @RequestMapping("/setSess")
    public String setSess(HttpServletRequest request){
        //从cookie中获取到了sessionID, 根据sessionID获取Session对象, 如果没有获取到, 会创建一个session对象
        HttpSession session = request.getSession();
        session.setAttribute("name", "zhangsan");
        return "设置session成功";
    }

再获取:

    @RequestMapping("/getSess")
    public String getSess(HttpServletRequest request){
        //从cookie中获取到了sessionID, 根据session获取Session对象
        HttpSession session = request.getSession();
        String name = (String)session.getAttribute("name");
        return "从session中获取name:"+name;
    }

 获取Session更为简洁的代码:

    @RequestMapping("/getSess2")
    public String getSess2(HttpSession session){
        String name = (String)session.getAttribute("name");
        return "从session中获取name:"+name;
    }

    @RequestMapping("/getSess3")
    public String getSess3(@SessionAttribute("name") String name){
        return "从session中获取name:"+name;
    }

获取Header
获取User-Agent
    @RequestMapping("/getHeader")
    public String getHeader(HttpServletRequest request){
        String userAgent = request.getHeader("User-Agent");
        return "从header中获取信息, userAgent:"+userAgent;

    }

更为简洁的代码:

    @RequestMapping("/getHeader2")
    public String getHeader2(@RequestHeader("User-Agent") String userAgent){
        return "从header中获取信息, userAgent:"+userAgent;

    }

标签:Java,name,Session,Spring,获取,MVC,Cookie,服务器,String
From: https://blog.csdn.net/wmh_1234567/article/details/141640649

相关文章

  • SpringBoot物流信息管理系统jeg7v 带论文文档1万字以上,文末可获取,
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表系统内容:用户,站点管理,网点信息,计费标准,订单信息,车辆信息开题报告内容一、研究背景与意义随着信息技术的飞速发展,物流行业正逐步向信息化、智能化转型。物......
  • 最新毕设-SpringBoot-求职推荐系统-55000(免费领项目)可做计算机毕业设计JAVA、PHP、爬
    摘 要当前社会竞争激烈,求职市场信息众多,但信息不对称、筛选困难的问题依然存在。因此,设计开发一款求职推荐系统是顺应时代发展的必然选择。该求职推荐系统利用Java编程语言,使用springboot技术框架,采取MySQL数据库实现系统的各项功能,具有便捷高效、安全友好的特点,促进求职招聘......
  • 【Spring Boot安全】Spring Boot 测试技巧
    原创1ang小羊安全屋一、SpringBoot介绍SpringBoot是一个开源的Java框架,旨在简化Spring应用的创建和部署过程。它是Spring平台和第三方库生态的一部分,由Pivotal团队开发。SpringBoot旨在让开发者能够更快速地启动和运行新的Spring应用程序,通过提供默认的配置帮助快速启......
  • 【java编程】深入浅出JVM(四):类文件结构
    原创菜菜的后端私房菜Java文件编译成字节码文件后,通过类加载机制到Java虚拟机中,Java虚拟机能够执行所有符合要求的字节码,因此无论什么语言,只要能够编译成符合要求的字节码文件就能够被Java虚拟机执行.Java虚拟机和字节码是语言、平台无关性的基石.本篇文章将深入浅出的解析......
  • 【SpringBoot开发】 文件上传 (秒传、断点续传、分片上传)
    原创Java技术前沿引言文件上传在软件开发项目中极为常见,涵盖了图片、音频、视频及各类文档的上传需求。对于小型文件,简单的Form表单上传机制通常足以应对。然而,当面对体积庞大的文件,如超过1GB的文件,或用户处于网络条件不佳的环境下时,传统的上传方式便显得力不从心。试想,用户......
  • 11.8 javaweb学习 day1 入门
    网页响应流程浏览器前端服务器后端服务器数据库1.浏览器请求前端2.前端响应浏览器3.浏览器请求后端4.后端请求数据库5.数据库响应后端6.后端响应浏览器网页的组成1.网页的文字,图片,音频,视频,超链接什么的,本质是前端代码2.前端代码通过浏览器的转化......
  • 深入探索 Java 8 Stream 流:高效操作与应用场景
    深入探索Java8Stream流:高效操作与应用场景随着Java8的发布,Stream流式处理成为了Java开发中处理集合数据的强大工具。它提供了一种简洁、声明式的方式来操作数据集合,极大地提高了代码的可读性和灵活性。本文将深入探讨Stream流的基本概念、核心操作、常见应用场......
  • 企业资产管理:SpringBoot框架优化
    5系统详细实现5.1用户信息管理企业资产管理系统的系统管理员可以对用户信息添加修改删除以及查询操作。具体界面的展示如图5.1所示。图5.1用户信息管理界面5.2用户审核管理系统管理员可以查看对用户注册信息进行审核操作。具体界面如图5.2所示。图5.2用户审核管......
  • Java实现身份证OCR识别API
    近年来,随着业务量的不断增加,人工录入方式越来越难以满足高效办理业务的需求,而且越来越多的移动APP涉及到个人身份证信息的实名认证,为了提高在移动终端上输入身份证信息的速度和准确性,一种可以识别并提取身份证上文字信息的技术接口应运而生,即身份证OCR识别API接口。以下是一......
  • Springboot跃动小商品在线交易系统6503y(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表用户,卖家,商品分类,商品品牌,商品信息开题报告内容一、选题背景与意义随着互联网技术的飞速发展,电子商务已成为推动全球经济一体化的重要力量。传统小商品市场......