session,cookie学习笔记
介绍:session为服务端缓存,存放在服务器内,与cookie不同,cookie是客户端缓存技术,
他们的区别大致理解起来就是:cookie:一个人去剪发,办了一张会员卡,每次剪发带上会员卡就可以有优惠
而session不同,session也同样办了会员服务,但是没有会员卡,每次来剪发直接说卡号就可以
cookie比较简单,就是在客户端保存一些信息,用户信息被保存到cookie中后,每一次访问该项目目录下的其他文件的时候就会知道用户的信息,从而达到跟踪用户的效果
session有按照基于cookie的和基于url的,基于cookie的就是在cookie里面保存session ID,用户在成功登录,也就是注册session ID以后,用户访问这个项目目录下的其他文件的时候通HTTP的请求头将保存在客户端cookie里面的session ID携带过来,web服务器通过根据这个session ID可以找到session里面的信息,以便可以识别用户,跟踪用户
但是,在任何浏览器中,用户都可以禁用cookie,当用户禁用cookie以后,以上的两种方式都不能在使用,但是session可以给予url传递,
下面介绍给予url的session的使用方法。
基于url的session就是将session的的信息通过url传递给web服务器。为什么在禁用cookie之后,给予cookie的session就不能够正常使用了呢,web服务器通过session识别一个用户是通过保存在客户端cookie里面的session ID实现的,在客户禁用cookie之后,session_start()函数在启动的时候,虽然想服务器申请了一个session ID但是这个session ID是不能够保存在cookie里面的,也就是用户访问其他页面的时候session_start()函数重新申请session ID,这个新申请的session ID当然和原先的不一样,所以web服务器也就不能跟踪这个用户了。
但是基于url为什么就可以了呢,因为在用户第一次访问也就是登录的时候,web服务器为该用户分配了一个session ID,这时候用户在访问下一个页面的时候,在session_start()函数之前,通过session_id()这个函数告诉web服务器用户的session_id,这时候文本服务器就又可以跟踪用户了,具体就是在session_start()之前加上if(isset($_GET['sid'])){ session_id($_GET['sid']);},sid是我自己设定的参数名称,具体可以根据自己的情况和喜好来定,当然这时候你需要在页面有链接的时候都加sid以及其值。
当然,禁用cookie的毕竟只是一小部分用户,这样做毕竟麻烦,这时候你可以不要那个if判断只在每个连接的后面加上SID这个常量,这时候如果客户端禁用了cookie,php会自动在url的后面加上一个以session name为键,以session ID为值的键值对,已达到和前面所说的url一样的效果,当然在用js跳转的时候这个方法是不行的,所以你要在那些以js跳转的地方加上按照url那种方式的键值对。开门见山吧,其实SID这种方式可以在php的配置文件中修改一个参数的方式实现,这个参数是session.use_trans_sid,你只需把它的参数设置为1就ok了,默认是0.
//访问session,当发现没有session时候,就会自动创建session httpSession session=request.getSession();
//给session放入属性
session.setAttribute("uname","名字");
session.setAttribute("age",60);
//删除属性
session.removeAttribute("age");
//session的生命周期默认30min tomcat的web.xml文件默认设
只能用一个浏览器获取
//获取session HttpSession session=request.getSession(); //获取 String uname = (String)session.getAttribute("uname");
防止用户非法登录到某个页面:
当用户登录成功后,可以把信息存放到session,然后再需要验证的页面中获取用户信息,如果为null,则说明用户非法,可以让其重新登录。
修改session生命周期
//一个地方是tomcat/conf/web.xml
<session-config>
<session-timeout>30</session-timeout>
</session-config>
//对所有的web应用生效
//另一个地方,就是单个的web应用下去修改web.xml文件同样写上面的代码
//如果冲突就以自己的web应用为标准
session.setMaxInactiveInterval(60);//60秒指的是发呆时间,60秒内无操作就死亡
session过期时间的问题:简单说一下,这部分其实是大有文章可做的,你可以改变session的存储位置,按照自定义的方式来存储和处理,你可以自己配置一个NFS或者samba服务器,用一台服务器乃至一个服务器集群来处理session信息,当然如果你把所有用户的session信息都保存在文件夹里面,这是如果网扎的访问量非常大,这时候的IO开销是惊人的,当然也可以把session保存在数据库里面,数据库非常快,但是我们都知道,数据库是最容易出现瓶颈的地方,一旦数据多到一定程度,数据库恐怕也不行,那就用到MemCache,MemCache不多说,因为我也不怎么会,我知道它是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,来储存各种格式的数据。首先说几个在php配置文件里面关于session的配置项,session.cookie_lifetime指的是session在客户端的生存时间,默认是0,表示知道浏览器关闭。session.gc_maxlifetime指的是session在web服务器的生存时间,如果用户在网页上超过这个时间还没有刷新,保存在服务器的session文件便会过期,成为垃圾,这个时候php有自己的具体垃圾回收机制来回收这些垃圾,具体由session.gc_probability和session.gc_divsor来决定,前者除以后者的值就是启动垃圾回收机制的概率,比如他们的比值是1/10,就是在启动十次session_start()函数是,就会有一次启动垃圾回收机制去处理这些垃圾。