【JavaEE进阶】Cookie和Session详解

这篇具有很好参考价值的文章主要介绍了【JavaEE进阶】Cookie和Session详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【JavaEE进阶】Cookie和Session详解,JavaEE进阶,java-ee,java,网络,tcp/ip,开发语言,intellij-idea,maven

目录

什么是Cookie

什么是Session

Cookie和Session的区别

获取Cookie

传统获取Cookie

简洁获取Cookie

Session的存取

Session存储

Session读取

传统方式获取

简洁获取Session(1)

简洁获取Session(2)


会话(Session)跟踪是 Web 程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是 Cookie SessionCookie通过在客户端记录信息确定用户身份Session通过在服务器端记录信息确定用户身份。这篇文章我们就来详细了解一下Cookie Session.

什么是Cookie

Cookie  是服务器传给客户端的体积很小的纯文本文件。客户端请求服务器,如果服务器需要记录该用户状态,就向客户端浏览器发一个 Cookie 。客户端浏览器会把 Cookie  保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该 Cookie 一同提交给服务器。服务器检查该 Cookie ,以此来辨认用户状态。

HTTP协议自身是属于"无状态"协议.

"无状态"的含义指的是:

默认情况下 HTTP 协议的客户端和服务器之间的这次通信,和下次通信之间没有直接的联系.

但是实际开发中,我们很多时候是需要知道请求之间的关联关系的. 例如登陆网站成功后,第二次访问的时候服务器就能知道该请求是否是已经登陆过了.
【JavaEE进阶】Cookie和Session详解,JavaEE进阶,java-ee,java,网络,tcp/ip,开发语言,intellij-idea,maven

比如去医院挂号
1. 看病之前先挂号.挂号时候需要提供身份证号,同时得到了一张"就诊卡",这个就诊卡就相当于患者的"令牌".
2. 后续去各个科室进行检查, 诊断,开药等操作,都不必再出示身份证了,只要凭就诊卡即可识别出当前患者的身份.
3.  看完病了之后,不想要就诊卡了,就可以注销这个卡.此时患者的身份和就诊卡的关联就销毁了. (类似于网站的注销操作)
4. 又来看病, 可以办一张新的就诊卡, 此时就得到了一个新的 "令牌"
 

上述图中的"令牌"通常就存储在 Cookie 字段中.

此时在服务器这边就需要记录"令牌"信息, 以及令牌对应的用户信息,这个就是Session机制所做的工作.

什么是Session

Session 是另一种记录客户状态的机制,不同的是 Cookie 保存在客户端浏览器中,而 Session 保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,这就是 Session。客户端浏览器再次访问时只需要从该 Session 中查找该客户的状态就可以了。Session 相当于程序在服务器上建立的一份用户的档案,用户来访的时候只需要查询用户档案表就可以了。

理解Session
我们先来了解一下什么是会话.

会话:对话的意思
【JavaEE进阶】Cookie和Session详解,JavaEE进阶,java-ee,java,网络,tcp/ip,开发语言,intellij-idea,maven

在计算机领域,会话是一个客户与服务器之间的不中断的请求响应.对客户的每个请求,服务器能够识别出请求来自于同一个客户. 当一个未知的客户向Web应用程序发送第一个请求时就开始了一个会话. 当客户明确结束会话或服务器在一个时限内没有接受到客户的任何请求时,会话就结束了.

比如我们打客服电话
每次打客服电话, 是一个会话. 挂断电话, 会话就结束了
下次再打客服电话, 又是一个新的会话.
如果我们长时间不说话,没有新的请求, 会话也会结束.

服务器同一时刻收到的请求是很多的. 服务器需要清楚的区分每个请求是从属于哪个用户,也就是属于哪个会话,就需要在服务器这边记录每个会话以及与用户的信息的对应关系.

Session 是服务器为了保存用户信息而创建的一一个特殊的对象.
【JavaEE进阶】Cookie和Session详解,JavaEE进阶,java-ee,java,网络,tcp/ip,开发语言,intellij-idea,maven

Session的本质就是一个"哈希表",存储了一些键值对结构. Key 就是 SessionID, Value 就是用户信息(用户信息可以根据需求灵活设计).
【JavaEE进阶】Cookie和Session详解,JavaEE进阶,java-ee,java,网络,tcp/ip,开发语言,intellij-idea,maven

Sessionld是由服务器生成的一个"唯一性字符串",  从Session机制的角度来看, 这个唯一性字符串称
为" Sessionld". 但是站在整个登录流程中看待,也可以把这个唯一性字符串称为 "token".

上述例子中的令牌ID, 就可以看做是Sessionld 只不过令牌除了ID之外, 还会带一些其他信息, 比如时间, 签名等.

1.当用户登陆的时候, 服务器在 Session 中新增一个新记录, 并把 Sessionld 返回给客户端. (通过
HTTP 响应中的 Set-Cookie 字段返回).

2.客户端后续再给服务器发送请求的时候,需要在请求中带上Sessionld. (通过HTTP请求中的
Cookie 字段带上). 

3.服务器收到请求之后,根据请求中的 SessionldSession 信息中获取到对应的用户信息, 再进行后续操作找不到则重新创建 Session, 并把 Sessionld 返回
【JavaEE进阶】Cookie和Session详解,JavaEE进阶,java-ee,java,网络,tcp/ip,开发语言,intellij-idea,maven

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

Cookie和Session的区别

1. Cookie 是客户端保存用户信息的一种机制. Session是服务器端保存用户信息的- -种机制.

2. Cookie Session之间主要是通过Sessionld关联起来的,SessionldCookieSession之间的
   桥梁

3. Cookie Session经常会在一起配合使用.但是不是必须配合.

  • 完全可以用 Cookie 来保存一些数据在客户端.这些数据不一定是用户身份信息,也不一定是Sessionld.
  • Session 中的 Sessionld 也不需要非得通过Cookie/Set-Cookie传递,比如通过URL传递.

4. Session 能够存储任意的 java 对象,Cookie 只能存储 String 类型的对象

5. SessionCookie  更具有安全性(Cookie  有安全隐患,通过拦截或本地文件找得到你的               Cookie 后可以进行攻击)

6. Session占用服务器性能,Session过多,增加服务器压力

7. 单个Cookie 保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个Cookie ,               Session  是没有大小限制和服务器的内存大小有关。

获取Cookie

传统获取Cookie

Spring MVC 是基于Servlet API构建的原始 Web 框架,也是在 Servlet 的基础上实现的HttpServletRequestHttpServletResponseServlet 提供的两个类, 是 Spring MVC 方法的内置对象.需要时直接在方法中添加声明即可.

HttpServletRequest 对象代表客户端的请求,当客户端通过 HTTP 协议访问服务器时,HTTP 请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息.

HttpServletResponse 对象代表服务器的响应. HTTP 响应的信息都在这个对象中,比如向客户
端发送的数据, 响应头, 状态码等. 通过这个对象提供的方法,可以获得服务器响应的所有内容

Spring MVC 在这两个对象的基础上进行了封装, 给我们提供更加简单的使用方法.
 

    @RequestMapping("/m10")
    public String getCookie(HttpServletRequest request, HttpServletResponse response) {
        //获取所有 cookie 信息
        Cookie[] cookies = request.getCookies();
        StringBuilder builder = new StringBuilder();
        if(cookies != null) {
            for(Cookie cookie : cookies) {
                builder.append(cookie.getName() + ":" + cookie.getValue() + " ");
            }
        }
        return "Cookid信息:" + builder;
    }

我们手动设置一下Cookie的值:

【JavaEE进阶】Cookie和Session详解,JavaEE进阶,java-ee,java,网络,tcp/ip,开发语言,intellij-idea,maven

通过浏览器访问测试:

【JavaEE进阶】Cookie和Session详解,JavaEE进阶,java-ee,java,网络,tcp/ip,开发语言,intellij-idea,maven

从这个例子中,也可以看出 Cookie 是可以伪造的,也就是不安全的,所以使用 Cookie 时,后端需要进行 Cookie 校验

简洁获取Cookie

也有更简洁的方式获取Cookie

    @RequestMapping("/getCookie")
    public String getCookie(@CookieValue("zhangsan") String value) {
        return "zhangsan:" + value;
    }

通过浏览器访问测试: 

【JavaEE进阶】Cookie和Session详解,JavaEE进阶,java-ee,java,网络,tcp/ip,开发语言,intellij-idea,maven

对应关系: 

【JavaEE进阶】Cookie和Session详解,JavaEE进阶,java-ee,java,网络,tcp/ip,开发语言,intellij-idea,maven

Session的存取

Session 是服务器端的机制, 我们需要先存储, 才能再获取

Session 也是基于 HttpServletRequest 来存储和获取的

Session存储

    @RequestMapping("/setSess")
    public String setSess(HttpServletRequest request) {
        //获取Session对象
        HttpSession session = request.getSession();
        if(session!=null) {
            session.setAttribute("username","java");
        }
        return "session 存储成功";
    }

session 存储的值可以是任意java对象:

【JavaEE进阶】Cookie和Session详解,JavaEE进阶,java-ee,java,网络,tcp/ip,开发语言,intellij-idea,maven

这个代码中看不到 Sessionld 这样的概念的. getSession 操作内部提取到请求中的 Cookie 里的
Sessionld , 然后根据 Sessionld 获取到对应的 Session 对象, Session 对象用 HttpSession 来描述.
【JavaEE进阶】Cookie和Session详解,JavaEE进阶,java-ee,java,网络,tcp/ip,开发语言,intellij-idea,maven

获取Session有两种方式

HttpSession getSession(boolean create);

HttpSession getSession();

HttpSession getSession(boolean create): 参数如果为 true, 则当不存在会话时新建会话;参数如果为 false ,则当不存在会话时返回 null

HttpSession getSession():getSession(true) 含义一样, 默认值为 true.

void setAttribute(String name, Object value): 使用指定的名称绑定一个对象 到该session会话
 

Session读取

传统方式获取

读取 Session 可以使用 HttpServletRequest

    @RequestMapping("/getSess")
    public String sess(HttpServletRequest request) {
        //如果 session 不存在, 不会自动创建
        HttpSession session = request.getSession(false);
        String username = null;
        if(session != null && session.getAttribute("username")!=null) {
            username = (String) session.getAttribute("username");
        }
        return "username:" + username;
    }

 通过浏览器访问测试: (测试前需要先存储session)

【JavaEE进阶】Cookie和Session详解,JavaEE进阶,java-ee,java,网络,tcp/ip,开发语言,intellij-idea,maven
Object gettribute(String name): 返回在该 session 会话中具有指定名称的对象,如果没有指定名
称的对象,则返回 null.

简洁获取Session(1)

    @RequestMapping("/getSess2")
    public String sess2(@SessionAttribute(value = "username", required = false) String username) {
        return "username:" + username;
    }

简洁获取Session(2)

通过Spring MVC内置对象HttpSession来获取

    @RequestMapping("/getSess3")
    public String sess3(HttpSession session) {
        String username = (String) session.getAttribute("username");
        return "username:" + username;
    }

HttpSession session = request.getSession();

Session 不存在的话,会自动进行创建

 【JavaEE进阶】Cookie和Session详解,JavaEE进阶,java-ee,java,网络,tcp/ip,开发语言,intellij-idea,maven文章来源地址https://www.toymoban.com/news/detail-850514.html

到了这里,关于【JavaEE进阶】Cookie和Session详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【网络应用层协议】【HTTP】详解HTTP与HTTPS、POST 请求与 GET请求 、TCP与UDP、cookie和session的区别

    目录 1. HTTP和HTTPS的区别 2. POST 请求与 GET 请求区别 3. TCP与UDP的区别 4. cookie和session的区别

    2024年04月14日
    浏览(49)
  • Java EE 网络原理之HTTP 响应详解

    表示了这次请求对应的响应,是什么样的状态 (成功,失败,其他的情况,对应的原因…) 这里的状态码非常多,我们需要了解里面常见的状态码 2XX 都表示 成功 200 最常见 3xx 表示 重定向 请求中访问的是 A 这样的地址,响应返回了一个重定向报文,告诉你应该要访问 B 地

    2024年02月03日
    浏览(49)
  • session和cookie详解

    访问网站后在本地存储的相关网站信息 ,是服务器在本地机器上存储的文本,并随着每一个请求发送到同一服务器上,以便某些网站为了辨别用户身份,由用户客户端计算机暂时或永久保存的信息,是客户端保存状态的一种方式。 1.web程序是使用HTTP协议传输的,而HTTP协议是

    2024年02月05日
    浏览(46)
  • cookie,session和token详解

    目前网络上进行用户验证的方法主要有三种:cookie,session,token,他们之间存在相似也有各自的优缺点,本文将着重强调。 cookie是浏览器存储在本地的文件,主要用于存储服务器对用户进行的标记,大小有限一般只为4kb,用户在第一次进行服务器请求时,服务器会生成对应的

    2024年02月13日
    浏览(40)
  • Cookie和session工作流程详解

    目录 cookie机制 session会话 理解会话机制 Servlet中对Cookie和Session提供的 HttpServletrequest类中的方法: 模拟实现登录功能 首先实现功能分为两个界面:  (1)登录页面代码(前端代码)    (2) 编写LoginServlet处理上述登录请求 登录http请求格式如下:    LoginServlet代码:    验证

    2024年02月07日
    浏览(42)
  • 「PHP系列」PHP Cookie/Session详解

    在PHP中,Cookie是一种用于在浏览器和服务器之间传递信息的机制。它通常用于跟踪用户的会话状态、存储用户的偏好设置或实现其他需要跨请求保持状态的功能。 名称和值 :每个Cookie都有一个名称和一个值,用于标识和存储信息。 过期时间 :可以设置Cookie的过期时间,以便

    2024年04月23日
    浏览(42)
  • 【JavaEE基础学习打卡03】Java EE 平台有哪些内容?

    📜 本系列教程适用于Java Web初学者、爱好者,小白白。我们的天赋并不高,可贵在努力,坚持不放弃。坚信量最终引发质变,厚积薄发。 🚀 文中白话居多,尽量以小白视角呈现,帮助大家快速入门。 🎅 我是 蜗牛老师 ,之前网名是 Ongoing蜗牛 ,人如其名,干啥都慢,所以

    2024年02月12日
    浏览(47)
  • 【JavaEE基础学习打卡02】是时候了解Java EE了!

    📜 本系列教程适用于 Java Web 初学者、爱好者,小白白。我们的天赋并不高,可贵在努力,坚持不放弃。坚信量最终引发质变,厚积薄发。 🚀 文中白话居多,尽量以小白视角呈现,帮助大家快速入门。 🎅 我是 蜗牛老师 ,之前网名是 Ongoing蜗牛 ,人如其名,干啥都慢,所

    2024年02月12日
    浏览(48)
  • 〖Python网络爬虫实战⑤〗- Session和Cookie介绍

    订阅:新手可以订阅我的其他专栏。免费阶段订阅量1000+                 python项目实战                  Python编程基础教程系列(零基础小白搬砖逆袭) 说明:本专栏持续更新中,目前专栏免费订阅,在转为付费专栏前订阅本专栏的,可以免费订阅付费专栏,

    2023年04月09日
    浏览(48)
  • 从Cookie到Session: Servlet API中的会话管理详解

    首先, 在学习过 HTTP 协议的基础上, 我们需要知道 Cookie 是 HTTP 请求报头中的一个段, 本质上是浏览器在本地存储数据的一种机制, 要清楚 Cookie 是从哪里来, 要到哪里去. Cookie 是来自于服务器的, 通过响应报文中的 Set-Cookie 字段将数据返回保存在浏览器本地的; 后续当浏览

    2024年02月08日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包