大家都知道,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,增加系统复杂性。
 
 
 

OSP 与 Session的更多相关文章

  1. session实现购物车

    为实现简单的购物功能(购物车添加.账户查看.购物车商品删除.实时的购物商品数量及价格的计算显示.购物车商品数量可手动输入等),用session实现了一简单的以php语言为基础.连接MySQL数据库的购 ...

  2. Asp.net Core中使用Session

    前言 2017年就这么悄无声息的开始了,2017年对我来说又是特别重要的一年. 元旦放假在家写了个Asp.net Core验证码登录, 做demo的过程中遇到两个小问题,第一是在Asp.net Cor ...

  3. 懒加载session 无法打开 no session or session was closed 解决办法(完美解决)

           首先说明一下,hibernate的延迟加载特性(lazy).所谓的延迟加载就是当真正需要查询数据时才执行数据加载操作.因为hibernate当中支持实体对象,外键会与实体对象关联起来.如 ...

  4. 探索ASP.NET MVC5系列之~~~6.Session篇(进程外Session)

    其实任何资料里面的任何知识点都无所谓,都是不重要的,重要的是学习方法,自行摸索的过程(不妥之处欢迎指正) 汇总:http://www.cnblogs.com/dunitian/p/4822808.ht ...

  5. Nhibernate的Session管理

    参考:http://www.cnblogs.com/renrenqq/archive/2006/08/04/467688.html 但这个方法还不能解决Session缓存问题,由于创建Session需 ...

  6. nginx+iis+redis+Task.MainForm构建分布式架构 之 (redis存储分布式共享的session及共享session运作流程)

    本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,上一篇分享文章制作是在windows上使用的nginx,一般正式发布的时候是在linux来配 ...

  7. zookeeper源码分析之六session机制

    zookeeper中session意味着一个物理连接,客户端连接服务器成功之后,会发送一个连接型请求,此时就会有session 产生. session由sessionTracker产生的,sessio ...

  8. [转载]Cookie/Session的机制与安全

    Cookie和Session是为了在无状态的HTTP协议之上维护会话状态,使得服务器可以知道当前是和哪个客户在打交道.本文来详细讨论Cookie和Session的实现机制,以及其中涉及的安全问题. 因 ...

  9. 修改session垃圾回收几率

    <?php //修改session垃圾回收几率 ini_set('session.gc_probability','1'); ini_set('session.gc_divisor','2'); ...

随机推荐

  1. Hibernate的配置文件 Hibernate.cfg.xml与xxx.hbm.xml

    1.hibernate.cfg.xml配置如下: (数据库连接配置) <?xml version="1.0" encoding="UTF-8"?>& ...

  2. 支付宝异步通知notify_url接收不了问题解决(转)

    此处return_url可以成功跳转回网站页面但notify_url却接收不到支付宝的异步通知.已保证notify_url是一个外网可以访问的网址 1.网站用的是ssh框架,当支付宝发通知到我这个ac ...

  3. JETSON TK1~Ubuntu14.04 Armhf源更新

    Ubuntu armhf版本的源网址不同于普通Ubuntu系统,如果采用如下网址会出现问题,导致sudo apt-get update出现Error. 之前的连接: deb http://archiv ...

  4. okhttp 请求list数据实例

    public class DataBean { /** * id : 61684 * movieName : <猜火车2>先导预告片 * coverImg : http://img31.m ...

  5. IOS平台的几个推送服务的对比

    http://blog.163.com/scuqifuguang@126/blog/static/171370086201399113833299/        最近研究了一下极光推送(JPush) ...

  6. 微信公众号验证TOKEN

    服务端验证微信token header('Content-type:text'); define("TOKEN", "weixin"); $signature ...

  7. Android Weekly Notes Issue #290

    Android Weekly Issue #290 December 31st, 2017 Android Weekly Issue #290 本期内容包括介绍Kotlin逆变协变的一篇(虽然没说清楚 ...

  8. hihocoder hiho第38周: 二分·二分答案 (二分搜索算法应用:二分搜索值+bfs判断可行性 )

    题目1 : 二分·二分答案 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上一回和上上回里我们知道Nettle在玩<艦これ>,Nettle在整理好舰队之后 ...

  9. win32com操作word(2):常用用法

    一.对象的位置关系: 1.Range属性位于(部分): Selection__Section__Cell__Paragraph__Table__Bookmark__Comment__Row__List ...

  10. 初识Spacy

    之所以想接触Spacy,是看到其自称为工业级的应用,所以想尝试下 windows下安装Spacy:     直接安装pip install spacy是会报错的     解决方法:     到 htt ...