session的由来
首先我们用浏览器打开一个网页用到的是HTTP协议,是无状态的(就是这一次的请求和上一次的请求是没有任何关系的)这时候,如果两个页面都要用到登陆状态的话,每次都去查数据库的话,就会使数据库有很大的压力。
这时候cookie就诞生了,它是把少量的信息存储在用户自己的电脑上,它在一个域名下使一个全局的,只要设置它的存储路径在域名www.a.com下,那么当用户用浏览器访问的时候,就可以任意读取cookie中的信息的。但是,由于是存储在客户端,所以用户可以看到,并且还可以随意修改,这样岂不是很不安全。
于是session就诞生了,session让两个页面都能读取到这个全局的session信息。session信息存在于服务器端,所以也就很好的解决了安全问题。
运行机制
好,现在来说一下session的运行机制:我们主要用PHP中的session的机制,其实各种语言差不多。第一步,我们要先开启session,session_start(),这是个无任何值的函数,既不会报错,也不会成功,它的作用就是开启session,并且会随机生成一个32为的session_id(就是为了标识唯一的用户),同时也会向cookie中传一个名字为PHPSESSION的变量,也就是session_id。
当我们浏览器的时候,如果用到开启session,就会去读cookie中的PHPSESSID是否有,如果没有的话就会重新生成一个session_id,先存入cookie中的PHPSESSID中,在生成一个sess_前缀文件
一般的应用场景:
1、登录时需要校验用户输入的用户名和密码,如果都正确,那么我们会将用户的信息存储到Session中。
在需要登录以后才能访问的页面中校验Session,如果Session有值,说明用户登录了,继续访问页面,如果没有值,说明用户没有登陆,那么跳转到登陆页面。
2、由于session是存到服务器的,所以尽量不要存一些过大的数据。session的默认过期时间是20分钟,但该过期时间为滑动过期时间(就是你第19分钟来访问,它会在往后延20分钟)
3、在一般处理程序中如果要使用session必须实现.IrequiresSessionState接口。(起到标记作用)
4、使用session一定要线判断为不为空,比较完session之后一定要清空session(一是节省空间,还有就是安全)
再说一下cookie机制
对于cookie客户端状态保持机制,网站的数据是存在客户端,与隐藏域与viewstate对象都属于这种客户端状态保持,cookie中存储的是关于网站相关的文本字符串数据,cookie的存储方式有两种,如果不指定过期时间,那么存储再客户端浏览器内存中;如果指定了过期时间,那么存储再客户端的磁盘上,cookie是与具体的网站有关的,如果我们将cookie设置了过期时间,那么当用户指定时间内访问我们的网站,那么属于我们的网站的cookie数据会放在请求报文中发送过来,其他网站的cookie不会发送。
创建cookie的两种方法:
一、
Respons.Cookies["cp4"].value="laowang";
Response.Cookies["cp4"].Expires=DateTime.Now.AddDays(3);
二、
HttpCookie cookie=new HttpCookie("cp4","laowang");
Cookie.Expires=DateTime.Now.AddDays(3);
Response.Cookies.Add(cookie);
有时用户打开浏览器后需要接收cookie的值,但是由于用户可以将其浏览器设置为拒绝接收cookie,所以我们需要先编写cookie,然后再尝试读该cookie,如果无法读取则提示用户开启 。
cookie和session的区别
通过前面介绍的session共享,我们了解到cookie数据存放在客户的浏览器上,而session数据放在服务器上。所以cookie不是很安全,而session就可以保证数据的安全性。我们知道session会在一定时间内保存在服务器上,但是当访问增多时会比较影响服务器的性能,这时我们可以考虑用cookie。综合考虑,一些重要的信息放在session中,而其他信息如果需要保留可以放在cookie中。
session的相关配置
[Session]
session.save_handler = files --表示的是session的存储方式,默认的是files文件的方式保存,还可以用memcache和redis来保存。
session.save_path = "d:/wamp/tmp"
session.use_cookies = 1 --默认为1,表示会在浏览器里创建值为PHPSESSID的session_id,session.name=PHPSESSID这个配置就是改这个名字的。
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0 --设置session信息保存的时长
session.serialize_handler = php
session.gc_divisor = 1000
session.gc_probability = 1
session.gc_maxlifetime = 1440 --这个和上面两个配合使用,是回收sess_xxx的文件
初出茅庐,还望大佬指教!