一、Session和Cookie的区别
Session是在服务器端保持会话数据的一种方法(通常用于pc端网站保持登录状态,手机端通常会使用token方式实现),存储在服务端。

Cookie是在客户端保持用户数据,存储位置是客户端(浏览器或者手机端)。

二、原理
1、当代码session_start(); 运行的时候,就在服务器上产生了一个session文件,随之也产生了与之唯一对应的一个session_id。

2、定义的Session变量以一定形式存储在刚才产生的session文件中。客户端将session_id传递给服务端,服务端根据session_id找到对应的文件,读取的时候,对文件内容进行反序列化就能得到session的值,保存的时候先序列化再写入。由此通过session_id可以取出之前定义的变量。

3、也就是说,Session_id是取得存储在服务器端Session变量的身份证。

注:PHP中的Session在默认的情况下,是使用客户端的Cookie来保存session_id的(session_start();之后,会自动将session_id存储在cookie中),但是必须注意,Session不一定必须依赖Cookie,这也就是Session相比于Cookie的高明之处。当客户端的Cookie被禁用或出现问题时,PHP会自动把session_id附着在URL中,这样再通过session_id就能实现跨页使用session变量了。但是这种附着也是有一定条件的,即php.ini文件中的“session.use_trans_sid=1”或者编译时打开了--enable-trans-sid选项。

三、实验cookie禁用后,session的传递
1、cookie未禁用时的结果
(1)php文件

c.php

 <?php
session_start();
$_SESSION['name'] = "xiaobudiu";
echo $_SESSION['name'];
echo "<hr>";
var_dump($_COOKIE);
echo "<hr>";
$url = "<a href = 'b.php'>下一页</a>";
echo $url;
?>

b.php

 <?php
session_start();
echo $_SESSION['name'];
echo "<hr>";
var_dump($_COOKIE);
die;
?>

(2)此时,运行c.php代码在浏览器会得到类似下面结果:

(3)此时点击“下一页”,跳转到b.php

2、禁用掉cookie之后,重新运行代码
注:禁用cookie位置:chrome://settings/content

得到的结果:

也就是说,在不更改php.ini配置文件的前提下,禁用掉cookie之后,默认session是无法跨页传输的

3、解决禁用掉cookie之后,让session仍然可以正常传输
(1)关闭php.ini配置文件中 session.use_only_cookies,打开php.ini配置文件中session.use_trans_sid,如下:

 session.use_trans_sid = 1
session.use_only_cookies = 0

(2)重新运次c.php

点击下一页进入b.php

可以看到,在浏览器禁用cookie之后,session仍然是可以继续传输的,只不过需要进行配置而已。

但事实上,并不太建议,也不需要这么做。毕竟是存在安全风险的。而且目前浏览器基本也不会主动禁用cookie。

四、Session在大型网站应用中需要注意的问题
 
1、如何解决Session文件过多,消耗IO性能
建议:可以更改php.ini的 session.save_handler 参数为redis或memcache等内存缓存数据库。

2、解决Session的同步问题
我们前端可能有很多台服务器,用户在A服务器上登录了,种下了session信息,然后访问网站的某些页面没准跳到B服务器上去了,如果这个时候B服务器上没有session信息又没有做特殊处理,可能就会出问题了。

解决方案:

(1)更改php.ini的 session.save_handler 参数为redis或memcache等内存缓存数据库

(2)还有一种方式是通过加密的cookie来实现,用户在A服务器上登录成功,在用户的浏览器上种上一个加密的cookie,当用户访问B服务器时,检查有无 session,如果有当然没问题,如果没有,就去检验cookie是否有效,cookie有效的话就在B服务器上重建session。这种方法其实很有 用,如果网站有很多个子频道,服务器也不在一个机房,session没办法同步又想做统一登录那就太有用了。
(3)当然还有一种方法就是在负载均衡那一层保持会话,把访问者绑定在某个服务器上,他的所有访问都在那个服务器上就不需要session同步了(比如负载均衡中的ip_hash)。

注释:此文章是专门为面试的小童鞋准备的,面试些奇葩的公司就会出现这道题如下面这张面试试卷

(声明:文章转载他处,若侵权,联系删除。)

Session的原理,大型网站中Session方面应注意什么?的更多相关文章

  1. Flask中session实现原理

    前言 flask_session是flask框架实现session功能的一个插件,用来替代flask自带的session实现机制,flask默认的session信息保存在cookie中,不够安全和灵活 ...

  2. 描述Cookie和Session的作用,区别和各自的应用范围,Session工作原理

    Session用于保存每个用户的专用信息. 每个客户端用户访问时,服务器都为每个用户分配一个唯一的会话ID(Session ID) . 她的生存期是用户持续请求时间再加上一段时间(一般是20分钟左右) ...

  3. 如何更有效使用 Rational AppScan 扫描大型网站,第 1 部分: 工作原理及技术分析

    Rational AppScan 工作原理 Rational AppScan(简称 AppScan)其实是一个产品家族,包括众多的应用安全扫描产品,从开发阶段的源代码扫描的 AppScan sourc ...

  4. session工作原理

    什么是Sesson? 这个是状态保持三大对象之一! 原意是会话,会议的意思! 就是你打开浏览器到关闭浏览器 这期间称为一个会话,也就是一个session, 它是保存在服务器端的. 每当客户端请求页面时 ...

  5. 分布式中session共享的解决方案:spring-session

    Session是客户端与服务器通讯会话跟踪技术,是服务器与客户端保持整个通讯的会话基本信息.客户端在第一次访问服务器的时候,服务端会响应一个sessionId并且将它存入到本地的Cookie中,在之后 ...

  6. 大型网站高可用架构之CAP原理

    在讨论高可用数据服务架构之前,必须先讨论的一个话题是,为了保证数据的高可用,网站通常会牺牲另一个也很重要的指标:数据一致性. CAP原理认为,一个提供数据服务的存储系统无法同时满足数据一致性.数据可用 ...

  7. hibernate中session

    hibernate中的session是一级缓存,可以理解为进程级的缓存.在进程运行期间一直存在. session可以理解为一个可以操作数据库的对象 具体如何操作数据库? session中有方法, 如果 ...

  8. tomcat中session在两个webapp中实现共享

    现在遇到一个需求就是要求完成简单的单点登录,通过在一个tomcat实例中放置两个webapps应用ROOT应用和CEO应用来完成在ROOT应用登录后,在CEO可以直接使用,而未在ROOT应用登录时,不 ...

  9. 第六篇 flask中session

    Flask中的Session非常的奇怪,他会将你的SessionID存放在客户端的Cookie中,使用起来也非常的奇怪 Flask 中 session 的使用 1. Flask 中 session 是 ...

随机推荐

  1. 自学自用 = B站(操作系统_清华大学(向勇、陈渝)) 未完待续。。

    视频地址 https://www.bilibili.com/video/av6538245 介绍 本篇博客,旨在记录视频学习的要点,所以格式随意, 方便本人日后自考和回忆,有兴趣的朋友可以评论讨论. ...

  2. Visual Studio 开发(一):安装配置Visual Studio Code

    一.为何使用Visual Studio Code 在学习音视频开发的时候,使用到了C和C++,在回顾复习C和C++的知识的时候,需要编写一些代码来加强理解. 虽然,有在线的语言编辑工具https:// ...

  3. Python中list的删除del&remove小区别

    del删除时候指定下标,remove必须指定具体的值

  4. PHP之ThinkPHP框架(界面)

    Thinkphp框架其精髓就在于实现了MVC思想,其中M为模板.V为视图.C为控制器,模板一般是公共使用类,在涉及数据库时,一般会跟数据表同名,视图会和控制器类里的方法进行名字的一一对应. 下载及配置 ...

  5. Redis 如何分析慢查询操作?

    什么是慢查询 和mysql的慢SQL日志分析一样,redis也有类似的功能,来帮助定位一些慢查询操作. Redis slowlog是Redis用来记录查询执行时间的日志系统. 查询执行时间指的是不包括 ...

  6. jetty8 text/plain默认字符编码的坑

    今天在测试一个content-type为text/plain的API时发现后端requestBody乱码了,而线上正常. 自己本地使用jetty8版本,插件自带版本,而线上使用jetty9. 最开始没 ...

  7. Java多线程之二(Synchronized)

    常用API method 注释 run() run()方法是我们创建线程时必须要实现的方法,但是实际上该方法只是一个普通方法,直接调用并没有开启线程的作用. start() start()方法作用为使 ...

  8. ArcSDE数据库连接(直连、服务连)与GT_Geometry存储配置图解

    众说周知,ArcSDE空间数据库引擎提供了两种连接数据库的方式.一是服务连接方式,一是直连方式.后者也是Esri所推崇的方式.但是,在客户的生产环境和开发商的开发环境中这两种方式都是有需求的.下面就以 ...

  9. https跨域到http问题解决

    整体结构 用户--https-->Nginx--http-->Tomcat 页面中包含了iframe,iframe的src也是Https的,但是当frame里面的内容表单提交后tomcat ...

  10. 又是一个Notepad++的问题

    昨天刚刚解决了Style Configurator无法保存的问题,今天继续解决另一个. 装好Notepad++之后,可以在右键菜单里面看到 Edit With Notepad++,win7里面挺好用的 ...