OSP 与 Session
为何要求超时,这纯粹是处于安全考虑。它是怎么做到的呢。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)。
回过来我们在说说ops。前面说osp不支持session。有三个意思:
(1)osp服务器没有记录你的登陆信息
(2)所以你的登陆永远也不会超时
(1)osp没有统一的安全校验机制(当然这个问题和它没有session概念没有关系),也就是说,服务器端没有做访问拦截(除了第一次登录时验证过一次),你这个账号是会否登录,是在客户端决定的,不是在服务器决定的。只要你访问服务器,他就接受你的请求,调用对应的后台程序。除非你后台程序自己做检查。所以这个登录基本上是没有啥意思,你完全可以写程序绕过osp的登陆页面。,直接访问数据(这个没有确认)。
这种做法,显然通过不过安全程序的检查。一扫描就把漏洞扫描出来了。
(2)无法禁止重复登录。因为他没记录你的登录信息,他也没法做这个检查。
以上两个问题一块考虑。
我们参考一般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,如果找不到,或者虽然找到但是失效了(是否超时),就定向到登录页面;否则执行请求的操作。
(1)保存在服务器内存
优点:速度快,
缺点:(1)如果使用的负载均衡,session在多个服务器之间不能共享,需要额外的同步机制;(2)一旦服务器重启,session就丢失了
(2)保存在数据库
优点:支持session共享和负载均衡;session能持久化存储。
缺点:性能较内存session略低。
(3)保存在内存数据库(redis)
具备前两种的优点。缺点是需要额外部署redis,增加系统复杂性。
OSP 与 Session的更多相关文章
- session实现购物车
为实现简单的购物功能(购物车添加.账户查看.购物车商品删除.实时的购物商品数量及价格的计算显示.购物车商品数量可手动输入等),用session实现了一简单的以php语言为基础.连接MySQL数据库的购 ...
- Asp.net Core中使用Session
前言 2017年就这么悄无声息的开始了,2017年对我来说又是特别重要的一年. 元旦放假在家写了个Asp.net Core验证码登录, 做demo的过程中遇到两个小问题,第一是在Asp.net Cor ...
- 懒加载session 无法打开 no session or session was closed 解决办法(完美解决)
首先说明一下,hibernate的延迟加载特性(lazy).所谓的延迟加载就是当真正需要查询数据时才执行数据加载操作.因为hibernate当中支持实体对象,外键会与实体对象关联起来.如 ...
- 探索ASP.NET MVC5系列之~~~6.Session篇(进程外Session)
其实任何资料里面的任何知识点都无所谓,都是不重要的,重要的是学习方法,自行摸索的过程(不妥之处欢迎指正) 汇总:http://www.cnblogs.com/dunitian/p/4822808.ht ...
- Nhibernate的Session管理
参考:http://www.cnblogs.com/renrenqq/archive/2006/08/04/467688.html 但这个方法还不能解决Session缓存问题,由于创建Session需 ...
- nginx+iis+redis+Task.MainForm构建分布式架构 之 (redis存储分布式共享的session及共享session运作流程)
本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,上一篇分享文章制作是在windows上使用的nginx,一般正式发布的时候是在linux来配 ...
- zookeeper源码分析之六session机制
zookeeper中session意味着一个物理连接,客户端连接服务器成功之后,会发送一个连接型请求,此时就会有session 产生. session由sessionTracker产生的,sessio ...
- [转载]Cookie/Session的机制与安全
Cookie和Session是为了在无状态的HTTP协议之上维护会话状态,使得服务器可以知道当前是和哪个客户在打交道.本文来详细讨论Cookie和Session的实现机制,以及其中涉及的安全问题. 因 ...
- 修改session垃圾回收几率
<?php //修改session垃圾回收几率 ini_set('session.gc_probability','1'); ini_set('session.gc_divisor','2'); ...
随机推荐
- 记录日志(Log4Net)
一:Log4net的简单示例 1.新建控制台应用程序,右键属性,把其框架.NET Framework4 Client Profile 修改为.NET Framework4,此时项目中将会自动添加一个A ...
- 九度OJ 1160:放苹果 (DFS)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:998 解决:680 题目描述: 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和 ...
- Cauchy sequence Hilbert space 希尔波特空间的柯西序列
http://mathworld.wolfram.com/HilbertSpace.html A Hilbert space is a vector space with an inner prod ...
- Django项目高频使用文件
数据库配置: MySQL数据库 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'HOST': 'localhost' ...
- UITableViewCell的多选操作
版权声明:本文为博主原创文章.未经博主同意不得转载,转载需加上原博客链接. https://blog.csdn.net/panyong4627/article/details/37902207 - ( ...
- 关于jquery-weui.js中时间控件datetimepicker的使用
今天第一次接触jquery-weui,不太了解用法,然而官方文档写的也很简略,只好打开源代码进行研究,我想要的是设置开始日期大于当前日期,然后在源码中发现有min这个默认为undefined的属性,于 ...
- 使用log4j将不同级别的日志信息输出到不同的文件中
使用log4j.xml xml格式的配置文件可以使用filter. 例如想只把log4j的debug信息输出到debug.log.error信息输出到error.log,info信息输出到info.l ...
- Win7 下安装MongoDB
1).下载MongoDBhttp://downloads.mongodb.org/win32/mongodb-win32-i386-2.4.5.zip 下载Windows 32-bit版本并解压缩,程 ...
- UTCformat 转换UTC时间并格式化成本地时间
/** * UTCformat 转换UTC时间并格式化成本地时间 * @param {string} utc */ UTCformat (utc) { var date = new Date(utc) ...
- 使用js获取当前页面的url网址信息。
1.设置或获取整个 URL 为字符串: window.location.href 2.设置或获取与 URL 关联的端口号码: window.location.port 3.设置或获取 URL 的协议部 ...