• PSO 与 Session


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

    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、PSO
    回过来我们在说说ops。前面说PSO不支持session。有三个意思:
    (1)PSO服务器没有记录你的登陆信息
    (2)所以你的登陆永远也不会超时
    那问题来了,既然服务器没有记录你的登录信息,那么在PSO客户端访问服务器时,服务器怎么知道来客是谁呢?这个你肯定知道:PSO登录后,把登录信息(比如账号)保存在客户端内存(网页)了。他每次访问服务器是,总是传给服务器(通过PO),说我胡汉三又来了。这是PSO和一般web应用区别之一:一般wen应用是将登录信息保存在服务器端(session),客户端和服务器端值传送sessionid,通过sessionID在服务端查找登录信息,PSO呢,把登陆信息保存在客户端,每次都要传登录信息给服务端。这两种做法没有质的区别,但显然前者更好一些,干净利索,不拖泥带水。

    3、PSO的问题
    (1)PSO没有统一的安全校验机制(当然这个问题和它没有session概念没有关系),也就是说,服务器端没有做访问拦截(除了第一次登录时验证过一次),你这个账号是会否登录,是在客户端决定的,不是在服务器决定的。只要你访问服务器,他就接受你的请求,调用对应的后台程序。除非你后台程序自己做检查。所以这个登录基本上是没有啥意思,你完全可以写程序绕过PSO的登陆页面。,直接访问数据(这个没有确认)。
    这种做法,显然通过不过安全程序的检查。一扫描就把漏洞扫描出来了。
    (2)无法禁止重复登录。因为他没记录你的登录信息,他也没法做这个检查。

    4,如何解决和实现
    以上两个问题一块考虑。
    我们参考一般web应用的做法,实现session,在服务器端记录你的登录信息,而不是在客户端。以下是实现:
    - 服务器:
    登录验证成功后,(1)生成唯一的一段数据,通过ro返回给客户端,命名为sessionID。(2)检查这个用户是否有其他有效的session,如果有并且不允许多点登录,就把其他的session删除掉(其他登录再次访问时,就失效了,被踢出去了。这个解决了PSO的第二个问题:不能禁止重复登录)。(3)在内存或者数据库,把这个sessionID记录下来,并记录和这个session关联的账号,该session最后一次访问的时间(客户端活跃时间)。
    - 客户端:
    登录成功后,(1)将收到的sessionID保存起来(保存在cookie或者内存,PSO是保存在内存,一般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,增加系统复杂性。

  • 相关阅读:
    DWR组件——基于远程过程调用实现Ajax
    JSTL学习笔记
    EL表达式学习笔记
    JavaScript学习笔记
    原生Ajax使用教程
    Response的返回内容类型
    Tomcat上文件的绝对路径访问笔记
    JSON语言规范与Java中两种解析工具基本使用
    Java生成XML文件与XML文件的写入
    编码问题笔记
  • 原文地址:https://www.cnblogs.com/senline/p/10877626.html
Copyright © 2020-2023  润新知