- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
我们用PHP开发后台的时候,需要对一些数据进行保存,而我们通常的做法就是进行数据库的保存,但是有时候我们一些是不需要保存在数据库中的,比如我们在登录网页的时候,在网站中显示我们上一次访问网站的时间,这个上一次访问的时间就可以不用保存在数据库中,同时我们在登录某个网页后,保存的登录的用户名,这些我们都可以不用保存在数据库中,而是使用PHP中的会话技术来解决。
PHP的cookie技术和session技术都是针对会话来进行的。这里的会话可以理解为当一个用户打开一个浏览器,访问某个网站,从用户访问该网站开始,到用户关闭访问网站页面结束,我们称为一个会话。在一次会话过程中,用户可以点击该网站页面的各个超链接,可以点击多次。
当我们访问一个网站和网站里面的页面,知道我们推出这个网站。就是一次会话。
我们有时候在访问某个网站的时候,一进入网站就可以在网页上看到我们上次访问当前网站的时间是多少。这个时间就可以使用cookie进行进行保存。
Cookie是客户端技术,服务器把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。注意cookie技术是写在浏览器端的文件。同时cookie的保存方式是以键值对的形式进行保存的。
从上面的流程图中可以看出来,在服务器的PHP文件中如果要创建cookie,则服务器把创建cookie的信息封装到http协议的响应头中进行信息的传递,浏览器接受到响应头后进行分析,知道了服务器需要在浏览器建立一个cookie,通过响应头的信息在本地创建一个cookie文件,当浏览器再次访问这个网站的时候会把本地的cookie信息发送给服务器。
Cookie:user=abc; PHPSESSID=v6ntsa42f4v0h5jpaoa1tot8r6
关于cookie的使用,可以简单的理解为对cookie的增删改查操作。
创建cookie其实很简单
<?php
//通过setcookie函数进行cookie的创建
setcookie('username','abc',time()+3600);
我们通过setcookie()函数进行cookie的创建,该cookie会保存在浏览器的缓存中。
Set-Cookie:username=abc; expires=Mon, 17-Oct-2016 08:55:51 GMT; Max-Age=3600
setcookie(参数1,参数2,参数3)我们在代码中可以看到在这个函数中传进去了三个参数,
第一个参数是保存信息的键的名字。
第二个参数是键对应的值
第三个参数是这个cookie保存的时间,这里保存的时间是当前时间加上3600秒,当超过这个时间时,cookie将会失效。
当我们执行完上面的代码我们可以在浏览器的缓存文件中看到创建的cookie的文件,里面有我们的保存的数据。
username
abc
www.lijiafei.com/test3/
1536
2120470400
30550100
480638768
30550092
*
在上面我们进行了数据的保存,我们保存数据的目的就是读取数据,而cookie的读取可以理解为:
<?php
echo '<pre>';
//自动封装到这个数组里面
var_dump($_COOKIE);
//通过键名取出值。
$username = $_COOKIE['username'];
echo $username;
......结果.......
array(3) {
["user"]=>
string(3) "abc"
["username"]=>
string(3) "abc"
["PHPSESSID"]=>
string(26) "v6ntsa42f4v0h5jpaoa1tot8r6"
}
abc
当我们访问文件的时候,通过请求头把cookie信息传递过去。
Cookie:user=abc; username=abc; PHPSESSID=v6ntsa42f4v0h5jpaoa1tot8r6
当我们想修改一个cookie的值的时候,仍然是使用setcookie来完成修改,但是如果cookie没有存在,则创建,如果已经有了,则修改。
<?php
//通过setcookie函数进行修改,但是如果浏览器没有cookie则进行创建。
setcookie('username','abc123',time() + 1600);
我们在进行读取cookie的值可以看到成功的修改了里面的值。
array(3) {
["user"]=>
string(3) "abc"
["username"]=>
string(6) "abc123"
["PHPSESSID"]=>
string(26) "v6ntsa42f4v0h5jpaoa1tot8r6"
}
abc123
当我们不行使用到cookie的时候,可以进行手动的销毁cookie的值。
删除cookie的数据可以理解为两步,1、删除保存在浏览器缓存的cookie文件,2、删除保存在服务器$_COOKIE数组中数据。
<?php
//使用setcookie这个函数进行删除
setcookie('username','',time()-1);
//删除保存在$_COOKIE里面的数据
if(isset($_COOKIE['username'])){
unset($_COOKIE['username']);
}
//删除保存在浏览器中这个网站的所有的cookie
foreach ($_COOKIE as $key => $value) {
setcookie($key,$value,time()-1);
}
//销毁所有数据
unset($_COOKIE);
我们运行上面的代码就可以删除所有的cookie信息。
上面的就是cookie最基本的操作。但是我们还有许多需要注意的地方:
我们可以看到在操作cookie的时候,都是通过setcookie进行不同的设置,但是我们在查帮助文档的时候,可以看到setcookie的参数并不是三个,而是可以七个参数。
bool setcookie ( string $name [, string $value = "" [, int $expire = 0 [, string $path = "" [, string $domain = "" [, bool $secure = false [, bool $httponly = false ]]]]]] )
而我们上面使用的就是前三个参数,设置键和值,同时设置保存的时间。
在setcookie()函数中第四个参数是控制cookie的有效路径的,当我们不设置的时候,默认的是当前路径和后台路径有效,但是当我们设置成’/’的时候,cookie全站有效。
案例目录结构:
...test
|_readcookie.php(读取cookie信息)
|_abc
|_createcookie.php(创建cookie)
|_def
|_readcookie.php(读取cookie);
两个readcookie.php代码一样:
<?php
echo '<pre>';
var_dump($_COOKIE);
创建cookie的代码:
<?php
//创建cookie保存数据
setcookie('user','abc',time() + 1600,'');
//再创建一个cookie信息,这两个cookie会保存在一个cookie文件里面
setcookie('password','123',time() + 1600,'/');
创建cookie的时候,第一个键值使用默认的有效路径第二个键值使用全站的有效路径。
当访问test目录下的readcookie.php文件时,只能显示password-123的键值信息。
array(1) {
["password"]=>
string(3) "123"
}
我们在开发中可能出现在一个网站(www.test.com)下面有两个域(www.a.test.com,www.b.test.com)名,如果我们不对cookie进行设置,这两个域名是不能互相访问对方的cookie的,但是如果我们对cookie进行设置,就可以实现域名共享。而setcookie()的第五个参数就是控制域名共享的。
<?php
//设置第五个参数表示两个域名可以共享cookie数据。
setcookie('username','abc','','','.test.com');
在我们在浏览网页的时候,大多数使用的的协议是HTTP协议,但是还有一种协议是HTTPs协议,这种协议比http协议更加安全,在开发中有时候当我们需要对某些重要的cookie数据必须在https协议下才能被传输,这是就会用到setcookie()函数的第六个参数进行设置。
<?php
//第五个参数设置为false表示可以在http协议和https协议下传输。
setcookie('username','abc','','','',false);
//第五个参数设置为false表示只能在https协议下传输。
setcookie('password','123','','','',true);
在默认情况下,cookie值是可以被其他脚本获取的,比如是JavaScript,这是就可能存在安全问题,那我们怎么防止其他脚本来读取cookie呢?
在setcookie()函数的最后一个参数就是控制cookie只能http协议进行读取。
<?php
//最后一个参数,设置为true表示只能是https协议进行读取。
setcookie('username','abc','','','',false,false);
上面的就是对会话技术cookie的介绍。在会话技术中还有之中技术也就是session。
在我们登录网页时,输入正确的账号和密码后,我们可以使用会话技术的session技术进行保存数据。
Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session文件,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务
当我们在服务器需要创建一个session的时候,会在服务器创建一个session文件,并且每个会话独享一份session文件,在服务器session文件默认存在在 c:/windows/temp 目录, 但是我们也可以在php.ini中进行修改。当服务器创建session后,会在返回数据的时候把session的id号封装到http协议的响应头中。
SetCookie:PHPSESSID=58j6c68qo6fhn31qrmt6bbrv70; path=/
这个响应信息和创建cookie的信息很想,但是浏览器并不会在浏览器的缓存中创建cookie文件。当浏览器保存住session的ID后,如果又要访问网页,浏览器会把session的ID封装在请求头中发送给服务器。
Cookie:PHPSESSID=58j6c68qo6fhn31qrmt6bbrv70
session的操作大致也可以分为增删改查四个步骤。
但是不管是什么操作都需要在操作前开启session机制,使用sessio_start()函数进行开启。同时session数据的保存也是通过键值对的方式进行保存的。session保存的数据类型可以是int,float,boolean,string,array,object。
<?php
//开启session机制
session_start();
//把数据保存在$_SESSION数组里面。
$_SESSION['user'] = 'abc';
先开启session机制,然后把需要的数据保存在$_SESSION数组里面当我们运行代码可以在http协议的响应头中添加了一段话:
Set-Cookie:PHPSESSID=p4lsn4vrdjtmkou1qc3tn3n577; path=/
同时我们也可以参看我们在服务器保存的session文件。
user|s:3:"abc";
<?php
//先开启session机制
session_start();
echo '<pre>';
//保存在session里面的数据会自动封装到$_SESSION数组里面
var_dump($_SESSION);
......结果......
array(1) {
["user"]=>
string(3) "abc"
}
当我们读取session的数据的时候,先开启session机制,这样服务器就会把session文件里面的数据封装到$_SESSION数组中,从而就可以对数据进行操作。
session的修改和cookie的修改是一样的,session怎么创建,就怎么修改,如果数据不存在就创建,如果数据存在就修改。
当我们不需要某些session数据的时候,我们可以进行数据的删除,当然,我们可以删除一个数据,也可以删除全部数据,甚至也可以删除session文件。
<?php
session_start();
// if(isset($_SESSION['user'])){
// //删除其中一个数据
// unset($_SESSION['user']);
// }
// //通过循环删除全部的数据。
// foreach ($_SESSION as $key => $value) {
// unset($_SESSION[$key]);
// }
//删除session文件
session_destroy();
我们可以根据自己的需求进行不同数据的删除。
从上面的讲解中可以看到操作session的函数并不像cookie一样只是一个函数,关于session的操作函数有许多。
在上面我们都是使用了session_start()函数来启动session机制,其实PHP给我们提供了两种方式来开启session
关于session的安全和cookie的安全设置一样,但是session不是通过函数的参数进行设置的,而是在php.ini文件中进行配置的。其中有几个关键的值:
上面的参数我们都是直接在php.ini配置里面修改的,这种修改是永久性的,但有时我们要求只是临时的修改php.ini文件,就可以使用ini_set()函数进行配置。ini_set函数可以去临时修改php.ini 的设置,而且设置只对当前的这个会话有影响。但是有一点ini_set函数要在 session_start()前,才能生效.
在上面我们在使用session的时候,只是简单的进行session_start()函数开启session机制,并且把数据封装到$_SESSION数组里面,但是我们并没有了解其中的过程,数据是怎么存储在数组里面,又是在什么时候保存在session文件中的,当destroy掉session文件的时候又是在哪里进行执行的,都没有了解。
session的存储机制大致可以分为三步,从session_start开始,到一个文件运行结束
在session_start()开启session机制后,
在脚本周期内,我们可以对$_SESSION数组进行增删改查的操作,注意在这里操作的数据并不会对保存在服务器端的session文件有影响。同时如果在这里使用session_destroy(),就会删除session文件并关闭session机制。
在脚本结束时,先判断session机制是否关闭,如果没有关闭就会把$_SESSION数组里面的数据写入session文件。
上面就是session的存储机制,理解并掌握存储机制,对我们使用session有很好的帮助。
在上面的存储机制中我们知道在开启session机制后第一步中通过判断哪些是无效的文件,然后session会启用垃圾回收机制(GC)进行回收,但是并不是每此开启都要进行回收的,其实在php.ini文件中有两个参数,设置了启用gc的概率。
它们是一对,表示垃圾回收的概率是多少,而概率的计算公式是session.gc_probability/ session.gc_divisor = 1/10000, 就是说,当调用10000次session_start() 函数,有一次会触发垃圾回收机制。
但是针对不同的网站我们设置不同的概率,对于大型网站,session.gc_divisor 设置大点,比如10000, 中型网站 500-1000, 小网站, 200-300,避免频繁的触发GC。
会话技术cookie和session在PHP开发中用到的还是很多的,理解两个技术不同的特点,让我们在开发中更加灵活的存储不同的数据。
我正在做一个关于代码学院的教程,我在这里收到一个错误,说“看起来你的函数没有返回‘唉,你没有资格获得信用卡。资本主义就是这样残酷。’”当收入参数为 75 时。”但是该字符串在控制台中返回(由于某种原因
我正在阅读 Go 的官方教程,但很难理解 Channel 和 Buffered Channels 之间的区别。教程的链接是 https://tour.golang.org/concurrency/2和
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 9年前关闭。 Improve this que
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
作为 iOS 新手,有大量书籍可以满足学习基础知识的需求。现在,我想转向一些高级阅读,例如 OAuth 和 SQLite 以及动态 API 派生的 TableView 等。您可以推荐任何资源吗? 最佳
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 8 年前。 Improve
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 8 年前。
前言 很多同学都知道,我们常见的CTF赛事除了解题赛之外,还有一种赛制叫AWD赛制。在这种赛制下,我们战队会拿到一个或多个服务器。服务器的连接方式通常是SSH链接,并且可能一个战队可能会同时有
Memcached是一个自由开源的,高性能,分布式内存键值对缓存系统 Memcached 是一种基于内存的key-value存储,用来存储小块的任意数据(字符串、对象),这些数据可以是数据库调用、A
Perl 又名实用报表提取语言, 是 Practical Extraction and Report Language 的缩写 Perl 是由 拉里·沃尔(Larry Wall)于19
WSDL 是 Web Services Description Language 的缩写,翻译成中文就是网络服务描述语言 WSDL 是一门基于 XML 的语言,用于描述 Web Services 以
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
我正在寻找解释在 WPF 中创建自定义用户控件的教程。 我想要一个控件,它结合了一个文本 block 、一个文本框和一个启动通用文件打开对话框的按钮。我已经完成了布局,一切都连接好了。它有效,但它是三
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我接近 fourth page of the Django tutorial 的开始看着vote查看,最后是这样的: # Always return an HttpResponseRedirect a
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
是否有任何好的 Qt QSS 教程,或者在某个地方我可以看到样式小部件的示例?如果某处可用,我想要一些完整的引用。除了有关如何设置按钮或某些选项卡样式的小教程外,我找不到任何其他内容。 最佳答案 Qt
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我是一名优秀的程序员,十分优秀!