SESSION与COOKIE区别是什么?用途、作用范围、生命周期?
存储位置:cookie : 存储用户浏览器上,用特定方式加密处理了。
session: 通常放置在服务器环境,tmp目录下,Linux系统一般在 /tmp
存储介质:都是以文本的形式(不能存储太多)cookie:浏览器每次访问网站,都要读取加载cookie文本
session:读取session要去寻找opendir、readdir
储存的大小、数量cooke 大概4kb 30-50个数量
session 理论上没有限制,存多也会慢,所以很多大型的网站会用内存来储存(redis、memcache);
储存的类型-cookie 常用来存标量bool(布尔型)\int(整形)\float(浮点)\string(字符串),数组和对象=>序列化json
-session 都可以
储存方法setcookie(name,value,time()+有效时间,有效路径,有效域名)
session_start() 使用session前,需要开启
$session[name] = value
读取接收$_COOKIE
$_SESSION
生命周期cookie
1.没有设置第三个参数,浏览器关闭即失效
2.设置了time()+t t时间后会失效
session
1.如果浏览器关闭。当前会话结束。但是session数据并不会失效
2.SESSION不能区分路径,同一用户在访问一个网站期间,所有的SESSION在任何一个地方都可以访问到
3.如果24分钟(php.ini)一直没有操作过该数据,这个数据会认为失效,但是文件还在
4.每次页面的session_start() 都会触发一个失效机制,默认是1/1000的概率会删除失效的session文件
安全性因为储存位置的关系,session相对安全
cookie存浏览器上,所以较为重要的数据,要做加密处理,虽然可以加密,但还是不推荐把密码等重要用户信息存储在cookie中
延伸的问题
1、禁用cookie后如何使用session还有session_id的使用
2、session依赖cookie,用户把cookie禁用了,如何继续使用session?
答 1:
- 1、如果用户禁止cookie,服务器仍会将sessionId以cookie的方式发送给浏览器,但是,浏览器不再保存这个cookie(即sessionId)了。
- 2、如果想继续使用session,需要采取其他方式来实现sessionId的跟踪。
- 3、url重写
a,什么是URL重写
浏览器在访问服务器上的某个地址时,不能够直接写这个组件的地址,而应该使用服务器生成的这个地址。
比如,<a href="some">someServlet</a> error
<a href-"<%=response.encodeURL("some")%>"></a>
encodeURL方法会在"some"后面添加sessionId。b,如何进行url重写。
encodeURL方法用在链接地址、表单提交地址。
response.encodeURL(String url);
encodeRedirectURL方法用于重定向地址。
response.encodeRedirectURL(String url);
可以使用url重写来实现sessionId的跟踪。5.session_destroy--关闭并销毁一个会话中的全部数据
答 2:
cookie session 统称为会话,session存在于服务器端,cookie存在于用户端。之前有人说过如果禁用了cookie那么session就使用不了了,可以说这是正确的,也可以说这是错误的。因为禁用了cookie,session_id就不能保存,而服务器正是根据session_id来判断用户的session,所以说这是正确的。经过测试,当我们禁用cookie时,刷新页面session_id会改变,说明session_id是用cookie保存的。
两个解决方法:
1 、session.use_cookies = 0 //设置客户端是否使用cookie来保存session值 该参数的值不影响上述机制的进行。
但是为了验证该机制,这里把该参数设为0,排除cookie携带seesionid的可能
session.use_only_cookies = 0 //是否只使用cookie来保存session值 该参数为1时,上述机制失效。
设置session.use_trans_sid = 1或者编译时打开打开了--enable-trans-sid选项
这样他会在每个url后面自动加上PHPSESSID的值,然后正常使用session就可以了。
----------------------------------------------------------------------------
2 、在url后面加上session_id的值或者保存session_id的值于数据库或redis中,然后在下一次要调用session前,运行session_id($session_id),还有这条语句要在session_start()前。
再聊下session_id吧,它是保存在cookie中,首先session是一个只要活动就不会过期的东西,只要开启cookie,每一次会话,session_id都不会改变,我们可以根据session_id来判断用户是否是正常登陆,防止用户伪造session。然后我们也要防止session被劫持,我们可以对session_id进行再一次的加密,防止暴力破解,还有可以设置HttpOnly。通过设置Cookie的HttpOnly为true,可以防止客户端脚本访问这个Cookie,从而有效的防止XSS攻击。