php cookie记录登录信息的原理与实例
我大概是这样做的:
(1)生成用户验证token
用户登录后我会生成一个token,该token可能由如下信息组成:username+ip+expiration+salt【只是举例】,然后将组成信息用可逆加密函数加密得到token,并将该token保存到数据库,写入cookie;
(2)最后这样去校验信息,判断用户的登录状态
将token解密,验证用户username,如果存在,继续;然后验证token是否和存入数据库的token相同,如果相同继续;验证cookie的有效期expiration,如果有效继续;验证ip是否变化,若变化跳入登录。。。。。。甚至还可以验证user agent.
例子
php session应用实例--登录验证:
代码如下 | 复制代码 |
<html> <body> ------------------------------------------------------------------------------------------------------------------------- <?php ------------------------------------------------------------------------------------------------------------------------- <?php session_start(); // 最后彻底销毁session. echo "注销成功"; <?php 由此我们可以得出删除Session的步骤: -------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------cookie登录验证实例---------------------------------------------
<body> ------------------------------------------------------------------------------------------------------------------------- <?php ------------------------------------------------------------------------------------------------------------------------- <?php ------------------------------------------------------------------------------------------------------------------------- <?php
|
最后说明:
1.上面保证了token每次登录都会不一样,这回导致之前的token【既cookie】失效
2.cookie的有效期最好不超过一周
3.在客户端COOKIES中保存用户ID和一个加密码(规则只有我知道)
4.如果程序检测到客户端保存的COOKIES ID。就去跟数据库验证加密码,如果一致则返回对应用户的登录信息,否则返回FALSE
感觉效率和安全性都不是很好
1.用户访问每个页面都要去跟数据库验证一遍
2.加密码虽然规则很复杂,但是保存在客户端依然存在被破解的可能性
const属性
用const属性定义的字段是一个常量,类中的常量和静态变量类似,不同之处就是常量的值一旦赋值不能被改变.const定义常量不需要加$符号,其结构形式如下:
const 常量名称 //常量名称不能用$符号
1、常量属性用 const 关键字来声明,不像常规属性一样用美元符$开头;
2、按照惯例,只能用大写字母来命名常量;
3、和全局变量一样,类常量一旦设置后就不能改变;
4、只包含基本数据类型的值,不能将一个对象指派给常量;
5、像静态属性一样,只能通过类而不能通过类的实例(对象)访问常量;
6、引用常量时不需要用美元符号为前导符;
7、给已经声明过的常量赋值会引起解析错误;
8、当需要在类的所有示例中都能访问某个属性,并且属性值无需改变时,应该使用常量。
代码如下 | 复制代码 |
<?php |
protected属性
protected限定的字段作用域在public和private之间,若该成员被声明称protected(保护),则代表只能在该类和该类的子类中使用该字段.
实例代码如下:
代码如下 | 复制代码 |
class me{ protected $Money =100; protected $price1=60; public function Sell($price){ if($this->price1<=$price){ echo "好,卖给你了. "; $this->Money = $this->Money+$price; return "我现在总共有 ".$this->Money." 元钱"; } else{ echo "我不卖 ,$price 太便宜了 "; return "现在我还是 ".$this->Money." 元钱"; } } } $now=new me; echo $now->Sell(30); ?> |
2、使用命名空间为了解决什么问题?
. 解决名字冲突,比如定义了一个类,正好这个类与PHP内部的类或是include进来的一个类库里的类重名了。
. 提高代码可读性,命名空间有一个别名功能,它可以帮你给一个长达十几个字符的类名起一个别名,从而缩短代码,也不用担心与其他空间的命名冲突。
3、哪一些代码会受命名空间的影响。
三类:类、函数、常量。只有它们兄弟三受影响,其他的该干嘛,还干嘛去。说到常量,php 5.3以后可以使用const关键字来定义常量,5.3这前使用define,命名空间只对const关键字有效。
4、命名空间如何定义
代码如下 | 复制代码 |
namespace MyProject; #例子二 namespace MyProjectSubLevel; const CONNECT_OK = 1;//php5.3以后 |
使用 `namespace 空间名` 来申明一个空间,在namespace之前除了declare语句不能有任何其他php语句,同时也不能有任何非php代码,连空格都不能有。
以下为错误的形式
代码如下 | 复制代码 |
$a = 1; |
另外同一个命名空间是可以定义在多个文件中,这对于组织框架是非常有用的。即以同一个namespace MyProject;开头的文件,它们是同一个命名空间。所以注意文件之间可不要有相同的类/函数/常量名哦。
当然同一个文件也可以定义多个命名空间,不过非常不建议这样做的。(了解同一个文件定义多个命名空间)
5、命名空间如何使用
命名空间有三种使用形式:
. 非限定名称 -- 没有使用任何的分割符,直接使用类/函数/常量名,如:new Foo(); foo(); echo FOO; 当文件有使用命名空间时,
代码如下 | 复制代码 |
<?php namespace MyObject; new Foo(); // 调用MyObjectFoo(); foo(); //调用MyObjectFoo(); echo FOO; //调用MyObjectFOO; |
. 非完全限定名称 -- 不是以分割符开头,如 new SubFoo(); 这种形式与非限定名称方式一样。
代码如下 | 复制代码 |
<?php |
. 完全限定名称 -- 以分割符开头的方式,相当于操作系统里的绝对地址。如 new OtherNSFoo();
代码如下 | 复制代码 |
<?php |
Tip: 对于函数和常量,还有一个特殊的地方(后备全局函数/常量)。
代码如下 | 复制代码 |
<?php |
对于类,也有一个特殊的地方。
代码如下 | 复制代码 |
<?php |
//注意对于类是不会去自动去调用全局作用域下的类的。*/
之前说了,命名空间还有一个用途-取别名。
代码如下 | 复制代码 |
namespace MyObject; new Foo(); //调用MyObjectFoo(); |
6、动态命名空间
动态总是能让人摸不着头脑,然而又带来灵活性。命名空间同样可以使用动态语言特点,但要注意由于直接调用命名空间是编译时解析的,而动态特征并非编译时解析。所以一定要加前缀。如:
代码如下 | 复制代码 |
namespace MyObjectSub; |
附1:同一个文件定义多个命名空间
方法有两种:
代码如下 | 复制代码 |
namespace MyProject; |
方法一,记流水帐。
代码如下 | 复制代码 |
namespace MyProject { const CONNECT_OK = 1; |
方法二,使用大括号把同一个命名空间的代码放在大括号里。这种方法,要求在大括号外不能有任何除了declare之外的代码。对于全局作用域的代码使用没有空间名的大括号包围起来
下面本文章来给大家介绍在php中成员变量的一些对比了,文章举了四个例子在这例子中分别对不同成员变量进行测试与获取操作,下面一起来看看。有如下4个代码示例,你认为他们创建对象,并获得成员变量的速度排序是怎样的?
1:将成员变量设置为public,通过赋值操作给成员变量赋值,直接获取变量
代码如下 | 复制代码 |
class Foo { class Foo2 { |
3:将成员变量设置为protected,通过构造函数设置成员变量的值,通过魔术方法获取变量
代码如下 | 复制代码 |
class Foo3 { protected $id; public function __construct($id) { $this->id = $id; } public function getId() { return $this->id; } } $data = new Foo3(10); echo $data->getId(); |
4:将成员变量设置为protected,通过构造函数设置成员变量的值,通过成员方法获取变量
代码如下 | 复制代码 |
class Foo4 { protected $id; public function __construct($id) { $this->id = $id; }//www.111cn.net public function __get($key) { return $this->id; } } $data = new Foo4(10); echo $data->id; |
按执行速度快慢排序: 1243
咱们先看其opcode:
代码如下 | 复制代码 |
1: 1 ZEND_FETCH_CLASS 4 :4 'Foo' 1 ZEND_FETCH_CLASS 4 :10 'Foo2' 1 ZEND_FETCH_CLASS 4 :15 'Foo3' 1 ZEND_FETCH_CLASS 4 :21 'Foo4' |
根据上面的opcode,参照其在zend_vm_execute.h文件对应的opcode实现,我们可以发现什么?
一、PHP内核创建对象的过程分为三步:
1.ZEND_FETCH_CLASS 根据类名获取存储类的变量,其实现为一个hashtalbe EG(class_table) 的查找操作
2.NEW 初始化对象,将EX(call)->fbc指向构造函数指针。
3.调用构造函数,其调用和其它的函数调用是一样,都是调用zend_do_fcall_common_helper_SPEC
二、魔术方法的调用是通过条件触发的,并不是直接调用,如我们示例中的成员变量id的获取(zend_std_read_property),其步骤为:
1.获取对象的属性,如果存在,转第二步;如果没有相关属性,转第三步
2.从对象的properties查找是否存在与名称对应的属性存在,如果存在返回结果,如果不存在,转第三步
3.如果存在__get魔术方法,则调用此方法获取变量,如果不存在,报错
回到排序的问题:
一、第一个和第二个的区别是什么?
第二个的opcode比第一个要少,反而比第一个要慢一些,因为构造函数多了参数,多了一个参数处理的opcode。参数处理是一个比较费时的操作,当我们在做代码优化时,一些不必要的参数能去掉就去掉;当一个函数有多个参数时,可以考虑通过一个数组将其封装后传递进来。
二、为啥第三个最慢?
因为其获取参数其本质上是一次对象成员方法的调用,方法的调用成本高于变量的获取
三、为啥第四个比第三个要快?
因为第四个的操作实质上获取变量,只不过其内部实现了魔术方法的调用,相对于用户定义的方法,内部函数的调用的效率会高。因此,当我们有一些PHP内核实现的方法可以调用时就不要重复发明轮子了。
四、为啥第四个比第二个要慢?
因为在PHP的对象获取变量的过程中,当成员变量在类的定义不在在时,会去调用PHP特有的魔术方法__get,多了一次魔术方法的调用。
总结一下:
1.使用PHP内置函数
2.并不是事必面向对象(OOP),面向对象往往开销很大,每个方法和对象调用都会消耗很多内存。
3.尽量少用魔术方法 -- 除非有必要,不要用框架,因为框架都有大量的魔术方法使用。
4.在性能优先的应用场景中,将成员变量不失为一种比较好的方法,当你需要用到OOP时。
5.能使用PHP语法结构的不要用函数,能使用内置函数的不要自己写,能用函数的不要用对象
第一种、利用$_SERVER内置数组变量
相对较为原始的$_SERVER['QUERY_STRING']来获取,URL的参数,通常使用这个变量返回的会是类似这样的数据:name=tank&sex=1
如果需要包含文件名的话可以使用$_SERVER["REQUEST_URI"](返回类似:/index.php?name=tank&sex=1)
第二种、利用pathinfo内置函数
01 <?php
02 $test = pathinfo("http://localhost/index.php");
03 print_r($test);
04 /*
05 结果如下
06 Array
07 (
08 [dirname] => http://localhost //url的路径
09 [basename] => index.php //完整文件名
10 [extension] => php //文件名后缀
11 [filename] => index //文件名
12 )
13 */
14 ?>
第三种、利用parse_url内置函数
01 <?php
02 $test = parse_url("http://localhost/index.php?name=tank&sex=1#top");
03 print_r($test);
04 /*
05 结果如下
06 Array
07 (
08 [scheme] => http //使用什么协议
09 [host] => localhost //主机名
10 [path] => /index.php //路径
11 [query] => name=tank&sex=1 // 所传的参数
12 [fragment] => top //后面根的锚点
13 )
14 */
15 ?>
第四种、利用basename内置函数
1 <?php
2 $test = basename("http://localhost/index.php?name=tank&sex=1#top");
3 echo $test;
4 /*
5 结果如下
6 index.php?name=tank&sex=1#top
7 */
8 ?>
另外,还有就是自己通过正则匹配的处理方式来获取需要的值了。这种方式较为精确,效率暂不考虑。。。
下面拓展实践下正则处理方式:
01 <?php
02 preg_match_all("/(\w+=\w+)(#\w+)?/i","http://localhost/index.php?name=tank&sex=1#top",$match);
03 print_r($match);
04 /*
05 结果如下
06 Array
07 (
08 [0] => Array
09 (
10 [0] => name=tank
11 [1] => sex=1#top
12 )
13 [1] => Array
14 (
15 [0] => name=tank
16 [1] => sex=1
17 )
18 [2] => Array
19 (
20 [0] =>
21 [1] => #top
22 )
23 )
24 */
25 ?>
路途漫漫...还有待继续挖掘...
相关文章
- PHPEMS(PHP Exam Management System)在线模拟考试系统基于PHP+Mysql开发,主要用于搭建模拟考试平台,支持多种题型和展现方式,是国内首款支持题冒题和自动评分与教师评分相...2016-11-25
- 在很多网站用户先访问一个要登录的页面,但当时没有登录后来登录了,等待用户登录成功之后肯定希望返回到上次访问的页面,下面我就来给大家介绍登录后跳转回原来要访问的页...2016-11-25
- 本文章完美的利用了php的curl功能实现模拟登录discuz以及模拟发帖,本教程供参考学习哦。 代码如下 复制代码 <?php $discuz_url = ‘ht...2016-11-25
- 本文实例讲述了JS使用cookie实现DIV提示框只显示一次的方法。分享给大家供大家参考,具体如下:这里运用JavaScript的cookie技术,控制网页上的提示DIV只显示一次,也就是当用户是第一次打开网页的时候才显示,第二次自动隐藏起...2015-11-08
Ruby on Rails实现最基本的用户注册和登录功能的教程
这里我们主要以has_secure_password的用户密码验证功能为中心,来讲解Ruby on Rails实现最基本的用户注册和登录功能的教程,需要的朋友可以参考下...2020-06-30- 什么是SSO?单点登录SSO(Single Sign-On)是身份管理中的一部分。SSO的一种较为通俗的定义是:SSO是指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后,再访问其他应用中的受保护...2015-11-08
- 【问题描述】:同一用户在同一时间多次登录如果不能检测出来,是危险的。因为,你无法知道是否有其他用户在登录你的账户。如何禁止同一用户多次登录呢? 【解决方案】 (1) 每次登录,身份认证成功后,重新产生一个session_id。 s...2015-11-24
- 什么是SSO?单点登录SSO(Single Sign-On)是身份管理中的一部分。SSO的一种较为通俗的定义是:SSO是指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后,再访问其他应用中的受保护...2015-11-08
- 这篇文章主要为大家详细介绍了vue实现用户登录切换,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-04-22
- 这篇文章主要介绍了vue项目中js-cookie的使用存储token操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-14
- 出现phpmyadmin不能登录是我在修改我mysql服务器密码之后导致的,后来百度了相关的原因,原来是修改了mysql密码之后我们还需要在phpmyadmin目录中去修改config.inc.php中...2016-11-25
Vue-Element-Admin集成自己的接口实现登录跳转
关于这个Vue-element-admin中的流程可能对于新的同学不是很友好,所以本文将结合实例代码,介绍Vue-Element-Admin集成自己的接口实现登录跳转,感兴趣的小伙伴们可以参考一下...2021-06-23- 这篇文章主要介绍了浅谈js二维码扫码登录是什么原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-04-13
- 什么是cookie? cookie 是存储于访问者的计算机中的变量。每当同一台计算机通过浏览器请求某个页面时,就会发送这个 cookie。你可以使用 JavaScript 来创建和取回 cookie 的值。 有关cookie的例子: 名字 cookie 当访...2014-05-31
- 这篇文章主要介绍了C#实现线程安全的简易日志记录方法,比较实用的功能,需要的朋友可以参考下...2020-06-25
python爬虫用request库处理cookie的实例讲解
在本篇内容里小编给大家整理的是一篇关于python爬虫用request库处理cookie的实例讲解内容,有需要的朋友们可以学习参考下。...2021-02-21- 昨天有一朋友说自己的phpmyadmin不能登录并且无任何提示了,问我怎么解决,下面我来分享一下关于phpmyadmin不能登录问题总结. phpmyadmin不能登录没有提示 解决方法:...2016-11-25
- session在php中是一个非常重要的东西,像我们用户登录一般都使用到session这个东西,相对于cookie来说session 要安全很多,同时我们购物车经常使用session来做临时的记录保存哦。使用session保存页面登录信息1、数据库连接...2015-10-21
- cookie 的用途之一是存储用户在特定网站上的密码和 id。另外,也用于存储起始页的首选项。在提供个人化查看的网站上,将要求阁下的网络浏览器利用阁下计算机硬驱上的少量...2016-11-25
- 本篇文章介绍了,基于C#后台调用跨域MVC服务及带Cookie验证的实现。需要的朋友参考下...2020-06-25