大家都知道,OSP是不支持session的,换句话说,登录有效期是永久的。一般网站,如果你不操作一段时间以后,必须重新登录。osp不是这样的,你一旦登录后,即便服务器重启了,你依然能访问服务器并不需要重新登录,服务器依然知道访问的是用户是谁;你打开浏览器登录了osp,然后再打开一个新页面,它还让你重新登录。我们分别分析下一般网站的和OSP的区别。

1、一般网站为何超时后必须重新登录
为何要求超时,这纯粹是处于安全考虑。它是怎么做到的呢。session!session翻译成会话,代表你从登陆到退出这段时间。技术上,session保存在服务端,一个登陆对应一个。如果有你的session,表示你的登录时有效的,否则你就不能访问系统。大家都知道http协议是无状态的,第一次访问和第二次访问本质上是无关的。那么服务器怎么知道来自客户端的一次访问对应服务器内的哪个session呢?
cookie大家都知道吧,是网站存储在浏览器本地的一些数据。游览器有个很重要的特性,每次访问服务器的时候,它都会把属于这个服务器域名的所有cookie都带上,发送给服务器。这是http协议的一部分。服务器能得到每个cookie的值。使用cookie识别“你”是有可能的:
(1)你访问京东网jd.com,登陆,登陆成功后,服务器随机生成一小块数据(确保每次生成的都不重复,比如guid串),返回给浏览器,浏览器保存下来,给这块数据起个名字叫“sessionID"。同时呢服务器上也把这个sessionID记录下来,并与登陆账号建立关系。
(2)随后,你再次访问京东,比如点击某个商品,浏览器会把这块命名为sessionID的数据发送给京东网站,京东网站根据名字拿到这个数据,到session列表里一查,查到这个数据了,同时根据这个数据找打关联的账号,这就知道,这次访问的是 “你”。这就是session 和 cookie的关系和用处。
那超时是怎么实现的呢,简单,服务器在记录sessionID的时候, 同时记录下来你最后一次访问服务器的时间,如果你再次访问,和上次访问的时间间隔超过了设定的时间,比如30分钟,服务器就认为,你太久没来了,不认你这个sessionID了。你的登录信息失效了!
如果浏览器禁用cookie怎么办(出于保护隐私目的,有的人会禁用cookie)。那网页就把表示session的cookie记录在内存中,每次访问网站是,就用get方式传给服务器(在url后加上 ?sessionID=xxxxx)(js脚本可以判断浏览器是否禁止了cookie)。
2、OSP
回过来我们在说说ops。前面说osp不支持session。有三个意思:
(1)osp服务器没有记录你的登陆信息
(2)所以你的登陆永远也不会超时
那问题来了,既然服务器没有记录你的登录信息,那么在osp客户端访问服务器时,服务器怎么知道来客是谁呢?这个你肯定知道:osp登录后,把登录信息(比如账号)保存在客户端内存(网页)了。他每次访问服务器是,总是传给服务器(通过PO),说我胡汉三又来了。这是osp和一般web应用区别之一:一般wen应用是将登录信息保存在服务器端(session),客户端和服务器端值传送sessionid,通过sessionID在服务端查找登录信息,osp呢,把登陆信息保存在客户端,每次都要传登录信息给服务端。这两种做法没有质的区别,但显然前者更好一些,干净利索,不拖泥带水。
3、osp的问题
(1)osp没有统一的安全校验机制(当然这个问题和它没有session概念没有关系),也就是说,服务器端没有做访问拦截(除了第一次登录时验证过一次),你这个账号是会否登录,是在客户端决定的,不是在服务器决定的。只要你访问服务器,他就接受你的请求,调用对应的后台程序。除非你后台程序自己做检查。所以这个登录基本上是没有啥意思,你完全可以写程序绕过osp的登陆页面。,直接访问数据(这个没有确认)。
这种做法,显然通过不过安全程序的检查。一扫描就把漏洞扫描出来了。
(2)无法禁止重复登录。因为他没记录你的登录信息,他也没法做这个检查。
4,如何解决和实现
以上两个问题一块考虑。
我们参考一般web应用的做法,实现session,在服务器端记录你的登录信息,而不是在客户端。以下是实现:
 - 服务器:
 登录验证成功后,(1)生成唯一的一段数据,通过ro返回给客户端,命名为sessionID。(2)检查这个用户是否有其他有效的session,如果有并且不允许多点登录,就把其他的session删除掉(其他登录再次访问时,就失效了,被踢出去了。这个解决了osp的第二个问题:不能禁止重复登录)。(3)在内存或者数据库,把这个sessionID记录下来,并记录和这个session关联的账号,该session最后一次访问的时间(客户端活跃时间)。
 - 客户端:
 登录成功后,(1)将收到的sessionID保存起来(保存在cookie或者内存,OSP是保存在内存,一般web应用是保存在cookie)。(2)(如果没有保存在cookie),每次请求,在po里吧sessionID传给服务器;如果保存在cookie,就不用管了,浏览器会自动给你带过去。
 - 服务器:收到请求后,首先通过拦截器,检查登录是否有效:拿到客户端传过来的sessionID(通过cookie或者PO),在服务器上查找这个session,如果找不到,或者虽然找到但是失效了(是否超时),就定向到登录页面;否则执行请求的操作。
5、session 怎么保存的问题
(1)保存在服务器内存
优点:速度快,
缺点:(1)如果使用的负载均衡,session在多个服务器之间不能共享,需要额外的同步机制;(2)一旦服务器重启,session就丢失了
(2)保存在数据库
优点:支持session共享和负载均衡;session能持久化存储。
缺点:性能较内存session略低。
(3)保存在内存数据库(redis)
具备前两种的优点。缺点是需要额外部署redis,增加系统复杂性。

转载于:https://www.cnblogs.com/senline/p/10877626.html

OSP 与 Session相关推荐

  1. 2022面试200题目和答案分布式+微服务+MYSQL+Redis+JVM+Spring

    200题目和答案分布式+微服务+MYSQL+Redis+JVM+Spring等等 带图MD在资源https://download.csdn.net/download/m0_47987937/86509 ...

  2. Struts2 Cannot create a session after the response has been committed 一个不起眼的错误

    严重: Servlet.service() for servlet default threw exception java.lang.IllegalStateException:  Cannot c ...

  3. 解决nginx负载均衡的session共享问题

    之前有写过ubuntu环境下搭建nginx环境,今天来谈一下nginx session共享问题,查了一些资料,看了一些别人写的文档,总结如下,实现nginx session的共享服务器有多台,用ngi ...

  4. 你想了解的Cookie和Session就在这~

    目录 1.会话的概念 2.保存会话的两种技术 3.Cookie 4.Session(重点) 1.会话的概念 我们知道session的意思就是会话,Cookie和Session 是两种会话技术,我们首先 ...

  5. Cookie和Session的区别与联系

    Cookie和Session Session 会话的理解 Session的作用 HTTP协议的无状态特点 Session的实现原理(重点) Session常用方法: Cookie 基本介绍 经典案例 ...

  6. php – Laravel 7 Session Lifetime

    根据Laravel config / session.php /* |----------------------------------------------------------------- ...

  7. [JAVA EE]session 和 token 机制

    HTTP 协议是无状态的. 即服务器对于客户端每次发送的请求都认为它是一个新的请求. 本次请求和上次请求无法判断是不是同一个客户端操作的. 随着 Web 应用的发展,如在线购物网站,需要登录的网站等, ...

  8. redis缓存和cookie实现Session共享

    分布式项目中要实现单点登录(SSO - Single Sign On):对于同一个客户端(例如 Chrome 浏览器),只要登录了一个子站(例如 a.com),则所有子站(b.com.c.com)都认 ...

  9. 负载均衡中使用 Redis 实现共享 Session

    最近在研究Web架构方面的知识,包括数据库读写分离,Redis缓存和队列,集群,以及负载均衡(LVS),今天就来先学习下我在负载均衡中遇到的问题,那就是session共享的问题. 一.负载均衡 负载均 ...

最新文章

  1. 【神经网络】Dependency Parsing的两种解决方案
  2. java格式化double_java – 格式化double以省略不必要的“.0”,永远不会关闭
  3. 量子计算入门-第一部分
  4. [css] 说说你对css盒子模型的理解
  5. PYTHON——多线程:Thread类与线程函数
  6. Java 中的接口有什么作用?为什么不直接用类?
  7. SAP License:税-你知道多少?
  8. RELEASE版本的RegisterClass()失败
  9. unity插件共享汇总大全
  10. 封装Selenium2Library
  11. Java基础之多态的运用
  12. (附源码)springboot宠物管理系统 毕业设计 121654
  13. 搜索引擎优化系统知名乐云seo_北京网络优化知名乐云seo
  14. Swift GYB 简易教程
  15. UDIMM和RDIMM内存条区别
  16. Mac下的Adobe卸载后无法重装
  17. 都是古人抓紧时间发奋苦读的典范
  18. openOCD的使用1: 应用openOCD和Jlink仿真器连接Freescale K60系列 MCU
  19. CDN还有这么多衍生品?! 云帆加速借技术创新笑傲短视频新蓝海
  20. C语言--visual studio 2019使用小技巧(番茄助手的代码提示)

热门文章

  1. 基于RTSP的流媒体播放器制作(2)
  2. Hive动态分区和分桶
  3. HTML+CSS+JavaScript网页制作案例教程-黑马程序员-第五章课后习题(课程介绍专栏效果)
  4. 计算二叉树的第k层中所有叶子结点个数
  5. 玩课网计算机基础课后答案,计算机类MOOC教学研讨会暨中国高校CMOOC联盟云南省工作委员会成立大会在昆明理工大学举行...
  6. 没有任何销售经验怎么进行销售团队管理?
  7. Lottie: 让动画实现更简单
  8. 如何搭建 Cinder UT测试环境?
  9. 【愚公系列】2022年01月 Java教学课程 73-反射
  10. 生活不止有眼前的苟且,还有远方的苟且