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博客主要来源与对以下技术博客的学习,当然不乏自己的思考、实践和提炼。

最新文章

  1. 深入理解CSS盒子模型
  2. Windows进程崩溃问题定位方法
  3. 使用wp_editor函数实现可视化编辑器
  4. Windows内核 WDM驱动程序的基本结构和实例
  5. ***php(codeigniter)中如何重定向
  6. [Jobdu] 题目1531:货币面值
  7. TableView 中cell间的分割线(及其他控件间(内)的分割线)设置
  8. 一个PHP开发者总结的九条建议
  9. ubuntu 14.04 vnc use gnome(ubuntu14.04 gnome for vnc4server)
  10. C++类与对象(05)
  11. Docker三十分钟快速入门(上)
  12. jQuery中有关mouse的事件--mousedown/up/enter/leave/over/out----2017-05-10
  13. python3 lcs 最大公共子序列
  14. GAN-生成对抗网络原理
  15. Linux的命令技巧
  16. jquery ----> How to Create a Basic Plugin (翻译)
  17. Liunx----vi编辑器
  18. PyQt5--QCalendar
  19. 7、Docker监控方案(cAdvisor+InfluxDB+Grafana)
  20. js学习(一)-对象和函数概念

热门文章

  1. 洛谷P1776 宝物筛选 题解 多重背包
  2. yarn详细入门教程(转载)
  3. FTP服务器虚拟用户配置
  4. C++ | C++ 概览 基础知识 | 01
  5. Go 每日一库之 flag
  6. 对Java中可变参数的理解
  7. 1、使用 as 而不要用 is
  8. 七种武器:JavaScript 新特性闪亮登场
  9. Greedy Gift Givers 贪婪的送礼者 USACO 模拟
  10. 解析Json字符串中的指定的值