session原理

session也是一种记录浏览器状态的机制,但与cookie不同的是,session是保存在服务器中。

由于http是无状态协议,当服务器存储了多个用户的session数据时,如何确认http请求对应服务器上哪一条session,相当关键。这也是session原理的核心内容。

  • 解决方法:服务器向客户端发送一条名为JESSIONID的cookie,它的值是session的id值。通过JESSIONID可以识别http请求对应哪一个用户。原理图如下所示:

session相关应用

与cookie共同使用

问题来源:session自动 维护的cookie的maxAge值为-1,这导致,浏览器关闭之后,存储JESSIONID的cookie会消失,服务器接收不到sessionid,session便会失效。

  • 解决方法:与cookie共同使用。手动创建名为JESSIONID的cookie,通过session.getId()获取sessionid,存入cookie,并设置maxAge。

代码如下:

Cookie cookie = new Cookie("JSESSIONID",session.getId());
cookie.setMaxAge(30*60);
cookie.setPath("/"); // 必须是根路径
response.addCookie(cookie);

经过实践,这样做有效。重启浏览器后,session依然可用。

防止表单重复提交

业务场景(重复提交的危害)

  • 在投票的网页上不停地提交,实现了刷票的效果;
  • 注册多个用户,不断发帖子,扰乱正常发帖秩序。

解决方法

  • 在session中存储一个token,专业做法是使用随机数或者时间戳;
  • 前端获取得到这个token,并将token写入表单的隐藏域中;
  • 在第一次提交表单时,判断seesion有没有值,如果有就比对token。对比正确后处理请求,然后删除session中的数据;
  • 再次访问的时,session是空的,即避免了重复提交;

一次性验证码

目的:防止暴力破解密码

实现方法

  • 初次访问时,服务端生成随机数,存入session域中,并生成验证码图片传给前端;
  • 表单填写完毕后,post请求服务器;
  • 后端读取参数中传递的验证码值,读取session域中的随机数值,验证两者是否相等。

session与cookie的区别

  • 存储

    • Cookie只能存储字符串,若要存储非ASCII字符,还需要对其编码;
    • Session可以存储任何类型数据。
  • 隐私
    • Cookie内容对客户端可见;
    • Session对客户端不可见。
  • 有效期
    • Cookie通过maxAge设置有效时间;
    • Session通过maxInactiveInterval属性设置有效时间;除此之外,存储JESSIONID的cookie有效期与session息息相关。
  • 对服务器的负担
    • Session是保存在服务器的,每个用户都会产生一个Session,如果是并发访问的用户非常多,是不能使用Session的,Session会消耗大量的内存;
    • Cookie是保存在客户端的。不占用服务器的资源。像baidu、Sina这样的大型网站,一般都是使用Cookie来进行会话跟踪。
  • 浏览器的支持
    • 浏览器有权选择是否禁用cookie;
    • 若禁用cookie,session可以通过URL地址重写来进行会话跟踪。
  • 跨域名上
    • Cookie可以通过设置domain属性来实现跨域名;
    • Session只在当前域名内有效。

本文和上一篇cookie博客主要来源与对以下技术博客的学习,当然不乏自己的思考、实践和提炼。

session学习总结【session原理、应用、与cookie区别】的更多相关文章

  1. 转:cookie和session(一)——原理

    文章来自于:http://blog.csdn.net/half1/article/details/21645545 一.cookie和session是什么?   cookie是服务器留在客户端中的小文 ...

  2. 【二十五】cookie与session学习总结

    一:cookie 1.创建cookie 关键字:setcookie 用于保存cookie 原理:当浏览器访问cookie.php页面时,我们的服务器就会以set-cookie的方式将cookie信息回 ...

  3. java web Session会话技术(原理图解+功能+与Cookie的区别+基本使用)

    java web Session会话技术(原理图解+功能+与Cookie的区别+基本使用) 这是我关于会话技术的第二篇文章,对 Cookie有不了解的兄弟可以点击下方的Cookie跳转 Cookie链 ...

  4. 专业3 Cookie 和Session的使用及原理

    Cookie的使用及原理 什么是cookie cookie是一种用来跟踪和识别用户上网信息的会话控制技术,它将跟踪后的信息存储在客户端的浏览器上 cookie如何使用 第一步:设置cookie即可(告 ...

  5. Python学习(三十六)—— Cookie、Session和自定义分页

    一.Django中操作Cookie 获取Cookie request.COOKIES['key'] request.get_signed_cookie(key, default=RAISE_ERROR ...

  6. Django学习笔记之URL与视图cookie和session

    cookie和session cookie:在网站中,http请求是无状态的.也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户.cookie的出现就是为了 ...

  7. JavaWeb——Cookie,Session学习汇总

    什么是Cookie Cookie的作用 安全性能 Cookie的语法 Cookie注意细节 Cookie实例练习 什么是会话Session Session语法 Session与浏览器窗口的关系 ses ...

  8. Servlet的学习之Session(3)

    在上一篇<Servlet的学习之Session(2)>我们知道了Session能实现一个会话过程中保存数据或者多个会话中实现同一个Session的关键因素就是Cookie,只是Cookie ...

  9. Servlet的学习之Session(2)

    在上一篇中我们学习了Session对象默认在一个会话过程中,由服务器创建,能保存在这个会话过程中用户访问多个web资源时产生的需要保存的数据,并在访问服务器中其他web资源时可以将这些数据从Sessi ...

随机推荐

  1. spring boot 整合freemaker

    前端最好使用vue.js 这里是freemaker 整合spring boot 1.编写pom文件: <dependencies> <dependency> <group ...

  2. Markdown数学符号

    上标 语法: x^2 效果: \(x^2\) 下标 语法: x_i 效果: \(x_i\) 整体 语法: x^{2y} 效果: \(x^{2y}\) 大括号 语法: \{\} 效果: \(\{\}\) ...

  3. 「Vijos 1284」「OIBH杯NOIP2006第二次模拟赛」佳佳的魔法阵

    佳佳的魔法阵 背景 也许是为了捕捉猎物(捕捉MM?),也许是因为其它原因,总之,佳佳准备设计一个魔法阵.而设计魔法阵涉及到的最关键问题,似乎就是那些带有魔力的宝石的摆放-- 描述 魔法阵是一个\(n ...

  4. c++数字和字符之间的转化

    关于C++中数与字符之间的转化 在c++中我们经常遇到需要把一个数变成字符,或者把字符变为一个数,c++中没有直接的转化函数,故我们需要自己去写函数去转化,这里我将介绍两种比较简单的方法: 法一: s ...

  5. Spring Cloud Stream消息驱动之RocketMQ入门(一)

    SpringCloudStream目前支持的中间件有RabbitMQ.Kafka,还有我最近在学习的RocketMQ,以下是我学习的笔记 学习Spring cloud Stream 可以先学习一下了解 ...

  6. 【转】安卓开发经验分享:资源、UI、函数库、测试、构建一个都不能少

    本文由 ImportNew - 唐尤华 翻译自 gigavoice.如需转载本文,请先参见文章末尾处的转载要求. 除了高超的武艺,每位黑忍者还需要装备最好的武器.在软件开发的世界里,好的工具能让我们的 ...

  7. EntityFramework Core表名原理解析,让我来,揭开你神秘的面纱

    前言 上一节我们针对最开始抛出的异常只是进行了浅尝辄止的解析,是不是有点意犹未尽的感觉,是的,我也有这种感觉,看到这里相信您和我会有一些疑惑,要是我们接下来通过注解.Fluent APi.DbSet分 ...

  8. 【UEFI】---关于BIOS,EIST和PState&CState和CPU主频变化得关系

    Intel处理器都支持Turbo和EIST,且一般情况下,各家厂商在BIOS中都会设置EIST和PState的开关,那么这些开关与CPU的频率的关系是什么呢?今天对此做个总结: 按照国际惯例,本次梳理 ...

  9. 位运算上的小技巧 - AtCoder

    Problem Statement There is an integer sequence of length 2N: A0,A1,…,A2N−1. (Note that the sequence ...

  10. hadoop 基础

    common 一组分布式文件系统和通用I/O的组件与接口(序列化.java RPC和持久化数据结构) Avro 一种支持高效.跨语言的RPC以及永久存储数据的序列化系统 MapReduce 分布式数据 ...