1.cookie的由来当用户访问一个网站时,web服务器会在本地计算机上保存一些信息。当用户再次访问该网站时,服务器会检查用户是否登录过该网站,如果登录过,则将本地记录的信息发送到网页进行展示。这就是cookie存在的意义。那么服务器是如何识别用户的呢?众所周知,http协议是一种无状态的连接。所谓无状态连接,就是浏览器每次向服务器发起请求,并不传递一个连接,而是每次都建立一个新的连接。如果是连接,服务器进程可以维护连接,并在内存中记住一些信息状态。每次请求结束后,关闭连接并释放相关内容,因此无法记住任何状态,成为无状态连接。基于http协议的服务器,对于不同的连接,服务器无法识别这些连接都是来自同一个用户,于是cookies应运而生。第一次访问服务器时,http报文中没有cookie。此时服务器指示浏览器在响应(response)下游HTTP报文中携带cookie信息;将cookie信息携带到请求(request)上游的HTTP请求中,从而实现HTTP模拟的状态。综上所述,cookie其实就是一小段文本信息。客户端向服务器发出请求,如果服务器需要记录用户状态,则使用响应向客户端浏览器下发cookie。客户端将保存cookie。当浏览器再次请求该网站时,浏览器将请求的URL连同cookie一起提交给服务器。服务器检查cookie以识别用户状态。服务器也可以根据需要修改cookie的内容。2.cookie的内容和特征cookie的主要内容:名称、值、域、路径和过期时间。Name和Value属性由程序设置,默认值为空。cookie页面所在目录的Path属性默认值为根目录,即“/”,无论发出cookie的页面在哪个目录。可以通过程序设置到某个路径进一步限制这个cookieExpires属性的范围,这个属性设置这个cookieCookies的过期日期和时间,sessioncookies存在于内存中,不存在于本地硬盘中;如果设置了过期时间,浏览器会将cookie保存到硬盘,关闭并再次打开浏览器后,这些cookie仍然有效,直到超过设置的过期时间。存储在硬盘上的Cookie可以在不同的浏览器进程之间共享。Cookie特点:cookies没有加密,可以随意篡改,非常不安全。Cookie不能在不同域之间共享。Cookie大小是有限制的,如下图所示。是的,session是另一种记录客户端状态的机制。不同的是cookie保存在客户端浏览器中,而session保存在服务器端。当客户端浏览器访问服务器时,服务器将客户端信息以某种形式记录在服务器上,这就是session。当用户连接到服务器时,服务器会创建一个session,服务器通过session_id来识别访问的是哪个用户。当用户建立会话(session)后,你就可以在用户授权成功时给他一个唯一的cookie。当用户提交表单时,浏览器会自动将用户的SessionId附加到HTTP头信息中。当服务器处理完这个表单后,将结果返回给SessionId对应的用户。综上所述,session是加密的,比cookie更安全。会话创建过程如下:为客户端请求创建会话时,服务器首先检查请求是否包含session_id。如果是这样,服务器将检索session_id。如果服务器没有存储session_id,则创建一个session_id;如果不是,则为该客户端创建一个会话并生成与该会话关联的sessionId。sessionId取值不重复,也不易被发现。伪造的字符串,这个sessionId会在这个response中返回给client保存。四、cookie和session的异同很多人说cookie和session是一回事,区别在于用户是否可见。我也同意这个观点。cookie作为session的载体,保存在本地浏览器中,操作存储方便,可以有效提高服务器性能(不占用内存)。但是,cookie存在纯文本不安全和大小受限等缺点。;session保存在服务器缓存中,加密,session_id的大小没有限制,但是会影响服务器性能。说到cookies和session的连接,就不得不提到禁用cookies。在客户端浏览器设置中,用户可以禁用cookies,因为cookies是session_id的载体,所以一旦禁用cookies,session就不能使用了。但是解决依赖问题有两种方法,一种是url重写,简单的把session_id参数放在url地址里,另一种是表单的隐藏字段,服务器会自动修改表单,增加一个隐藏字段,所以即表单中提交时可以将session_id传回服务器,如下图:另一种连接是sessionsharing。对于单台服务器有多个网站(同一父域的不同子域),我们需要解决的是不同网站session_id的共享。由于域名不同(aaa.test.com和bbb.test.com),并且session_id保存在各自的cookie中,服务器会认为这两个子站点的访问来自不同的session。解决方案是通过修改cookie的域名为父域名来达到cookie共享的目的,从而实现session_id的共享。缺点是子站点之间的cookie信息也是共享的。5、laravel下的相关应用session应用在config/session.php中配置如下:'driver'=>env('SESSION_DRIVER','file'),'lifetime'=>120,'expire_on_close'=>false,'encrypt'=>false,'files'=>storage_path('framework/sessions'),'connection'=>null,'table'=>'sessions','lottery'=>[2,100],'cookie'=>'laravel_session','path'=>'/','domain'=>null,'secure'=>false,];driver配置项用于设置Session的存储方式,默认为file,即存储在文件中,文件位于files配置项配置的路径下,即storage/framework/sessions。另外,Laravel还支持其他存储方式:database:将Session数据存储在指定的数据表中,由配置项表设置memcached:将Session数据存储在Memcached中redis:将Session数据存储在Redis数组中:存储Session数据为存储在一个数组中。此配置仅用于测试环境。修改驱动配置需要到项目根目录下的.env文件中修改SESSION_DRIVER选项。lifetime配置项用于设置session的有效期,默认为120分钟。expire_on_close配置项用于设置浏览器关闭时是否立即使Session失效。encrypt配置项用于配置Session数据是否加密。lottery配置项用于配置回收Session的存放位置。cookie配置项用于配置存储SessionID的cookie名称,默认为laravel_session。path配置项用于配置存储SessionID的cookie存储路径,默认为项目根目录。domain配置项用于配置存储SessionID的cookie存储域名。secure配置项用于配置是否只在HTTPS协议下向服务器发送SessionID。使用会话函数session(['site.xxx'=>'LaravelAcademy.org']);$site=session('site');dd($site);使用请求请求我们可以通过这种方式获取所有会话数据:$sessions=$request->session()->all();我们可以像这样访问会话数据:$request->session()->put('site','http://LaravelAcademy.org');if($request->session()->has('site')){$site=$request->session()->get('site');dd($site);}也可以像这样获取会话数据(如果对应的会话不存在,返回默认值):$sitename=$request->session()->get('sitename','LaravelAcademy');dd($站点名称);另外,可以使用push方法将多个数据推送到Session数组:$request->session()->push('site.xxx','http://LaravelAcademy.org');$request->session()->push('site.xxx','LaravelCollege');if($request->session()->has('site')){$site=$request->session()->get('地点');dd($site);}获取数据后使用pull方法删除。使用flush方法一次删除所有会话数据。使用forget方法删除某个会话数据。如果要保证一次性session数据有效,可以定义TestController@sessionx代码如下:publicfunctionsessionx(Request$request){$request->session()->刷新();$message=session('消息');echo$message;}所以不管你怎么刷新Session数据,它总是有效的此外,还可以指定哪些Session数据有效:$request->session()->keep(['message']);你也可以自己编译laravel代码:如果($this->sessionConfigured()){$session=$this->startSession($request);//启动会话$request->setSession($session);$response=$this->app->handle($request,$type,$catch);//调用控制器的方法if($this->sessionConfigured()){$this->closeSession($session);//关闭会话$this->addCookieToResponse($response,$session);}返回$响应;}...保护函数closeSession(SessionInterface$session){$session->save();//保存会话$this->collectGarbage($session);}}cookie应用添加Cook即例如我们需要在controller中设置一个“Hello,Laravel”cookie值,并设置有效期为10分钟。推荐使用cookie队列方法Cookie::queue(),因为cookie会自动添加到response中:cookie('younger');dump($cookie);}如果想获取所有cookie的值,可以使用不传参的方法:publicfunctionindex(Request$request){$cookies=$request->cookie();dump($cookies);}清除cookie的方法比较简单,原理和设置cookie一样,只是过期时间设置为过去。还需要使用make()或forget()方法将Cookie添加到HTTP响应中:方法1:\Cookie::queue(\Cookie::forget('younger'));或\setcookie('年轻','',-1,'/');方法二:$cookie=Cookie::forget('younger');//返回Redirect::route('index')->withCookie($cookie);参考博文https://segmentfault.com/a/11...http://www.cnblogs.com/endles...http://blog.csdn.net/sundache...http:///博客。csdn.net/proglove...https://www.zhihu.com/questio...http://laravalacademy.org/pos...http://www.cnblogs.com/phpper...
