php cookie记录登录信息的原理与实例

 更新时间:2016年11月25日 14:59  点击:2155
cookie登录我们一般会对保存在cookie中的值越冬加密处理,然后每次判断时再把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>
<head>
<title>Login</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>

<body>
<form name="form1" method="post" action="login.php">
<table width="300" border="0" align="center" cellpadding="2" cellspacing="2">
<tr>
<td width="150"><div align="right">用户名:</div></td>
<td width="150"><input type="text" name="username"></td>
</tr>
<tr>
<td><div align="right">密码:</div></td>
<td><input type="password" name="passcode"></td>
</tr>
<tr>
<td><div align="right">Cookie保存时间:</div></td>
<td><select name="cookie" id="cookie">
<option value="0" selected>浏览器进程</option>
<option value="1">保存1天</option>
<option value="2">保存30天</option>
<option value="3">保存365天</option>
</select></td>
</tr>
</table>
<p align="center">
<input type="submit" name="Submit" value="Submit">
<input type="reset" name="Reset" value="Reset">
</p>
</form>
</body>
</html>

-------------------------------------------------------------------------------------------------------------------------

<?php
@mysql_connect("localhost", "root","1981427")     //选择数据库之前需要先连接数据库服务器
or die("数据库服务器连接失败");
@mysql_select_db("test")      //选择数据库mydb
or die("数据库不存在或不可用");
//获取用户输入
$username = $_POST['username'];
$passcode = $_POST['passcode'];
//执行SQL语句获得Session的值
$query = @mysql_query("select username, userflag from users "
."where username = '$username' and passcode = '$passcode'")
or die("SQL语句执行失败");
//判断用户是否存在,密码是否正确
if($row = mysql_fetch_array($query))
{
session_start();        //标志Session的开始
//判断用户的权限信息是否有效,如果为1或0则说明有效
if($row['userflag'] == 1 or $row['userflag'] == 0)
{
$_SESSION['username'] = $row['username'];
$_SESSION['userflag'] = $row['userflag'];
echo "<a href="main.php" mce_href="main.php">欢迎登录,点击此处进入欢迎界面</a>";
}
else          //如果权限信息无效输出错误信息
{
echo "用户权限信息不正确";
}
}
else           //如果用户名和密码不正确,则输出错误
{
echo "用户名或密码错误";
}
?>

-------------------------------------------------------------------------------------------------------------------------

<?php

session_start();
unset($_SESSION['username']);
unset($_SESSION['passcode']);
unset($_SESSION['userflag']);

// 最后彻底销毁session.
         session_destroy();

echo "注销成功";
?>

         <?php
         // 初始化session.
         session_start();
         /*** 删除所有的session变量..也可用unset($_SESSION[xxx])逐个删除。****/
         $_SESSION = array();
         /***删除sessin id.由于session默认是基于cookie的,所以使用setcookie删除包含session id的cookie.***/
         if (isset($_COOKIE[session_name()])) {
               setcookie(session_name(), '', time()-42000, '/');
          }
         // 最后彻底销毁session.
         session_destroy();
         ?>

由此我们可以得出删除Session的步骤:
①session_start()
②$_SESSION=array()/unset($_SESSION['xxx'])
③session_destroy()

-------------------------------------------------------------------------------------------------------------------------


<?php
session_start();
if(isset($_SESSION['username']))
{
@mysql_connect("localhost", "root","1981427")     //选择数据库之前需要先连接数据库服务器
or die("数据库服务器连接失败");
@mysql_select_db("test")      //选择数据库mydb
or die("数据库不存在或不可用");
//获取Session
$username = $_SESSION['username'];
//执行SQL语句获得userflag的值
$query = @mysql_query("select userflag from users "
."where username = '$username'")
or die("SQL语句执行失败");
$row = mysql_fetch_array($query);
//判断当前数据库中的权限信息与Session中的信息比较,如果不同则更新Session的信息
if($row['userflag'] != $_SESSION['userflag'])
{
$_SESSION['userflag'] = $row['userflag'];
}
//根据Session的值输出不同的欢迎信息
if($_SESSION['userflag'] == 1)
echo "欢迎管理员".$_SESSION['username']."登录系统";
if($_SESSION['userflag'] == 0)
echo "欢迎用户".$_SESSION['username']."登录系统";
echo "<a href="logout.php" mce_href="logout.php">注销</a>";
}
else
{
echo "您没有权限访问本页面";
}
?>

-------------------------------------------------------------------------------------------------------------------------

-------------------------------------------------------------cookie登录验证实例---------------------------------------------


<html>
<head>
<title>Login</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>

<body>
<form name="form1" method="post" action="login.php">
<table width="300" border="0" align="center" cellpadding="2" cellspacing="2">
<tr>
<td width="150"><div align="right">用户名:</div></td>
<td width="150"><input type="text" name="username"></td>
</tr>
<tr>
<td><div align="right">密码:</div></td>
<td><input type="password" name="passcode"></td>
</tr>
<tr>
<td><div align="right">Cookie保存时间:</div></td>
<td><select name="cookie" id="cookie">
<option value="0" selected>浏览器进程</option>
<option value="1">保存1天</option>
<option value="2">保存30天</option>
<option value="3">保存365天</option>
</select></td>
</tr>
</table>
<p align="center">
<input type="submit" name="Submit" value="Submit">
<input type="reset" name="Reset" value="Reset">
</p>
</form>
</body>
</html>

-------------------------------------------------------------------------------------------------------------------------

<?php
@mysql_connect("localhost", "root","1981427")     //选择数据库之前需要先连接数据库服务器
or die("数据库服务器连接失败");
@mysql_select_db("test")      //选择数据库mydb
or die("数据库不存在或不可用");
//获取用户输入
$username = $_POST['username'];
$passcode = $_POST['passcode'];
$cookie   = $_POST['cookie'];
//执行SQL语句
$query = @mysql_query("select username, userflag from users "
."where username = '$username' and passcode = '$passcode'")
or die("SQL语句执行失败");
//判断用户是否存在,密码是否正确
if($row = mysql_fetch_array($query))
{
if($row['userflag'] == 1 or $row['userflag'] == 0)    //判断用户权限信息是否有效
{
switch($cookie)         //根据用户的选择设置cookie保存时间
{
case 0:         //保存Cookie为浏览器进程
setcookie("username", $row['username']);
break;
case 1:         //保存1天
setcookie("username", $row['username'], time()+24*60*60);
break;
case 2:         //保存30天
setcookie("username", $row['username'], time()+30*24*60*60);
break;
case 3:         //保存365天
setcookie("username", $row['username'], time()+365*24*60*60);
break;
}
header("location: main.php");      //自动跳转到main.php
}
else
{
echo "用户权限信息不正确";
}
}
else
{
echo "用户名或密码错误";
}
?>

-------------------------------------------------------------------------------------------------------------------------

<?php
session_start();
if(isset($_COOKIE['username']))
{
@mysql_connect("localhost", "root","1981427")     //选择数据库之前需要先连接数据库服务器
or die("数据库服务器连接失败");
@mysql_select_db("test")      //选择数据库mydb
or die("数据库不存在或不可用");
//获取Session
$username = $_COOKIE['username'];
//执行SQL语句获得userflag的值
$query = @mysql_query("select userflag from users "
."where username = '$username'")
or die("SQL语句执行失败");
$row = mysql_fetch_array($query);
//获得用户权限信息
$flag = $row['userflag'];
//根据userflag的值输出不同的欢迎信息
if($flag == 1)
echo "欢迎管理员".$_COOKIE['username']."登录系统";
if($flag == 0)
echo "欢迎用户".$_COOKIE['username']."登录系统";
echo "<a href="logout.php" mce_href="logout.php">注销</a>";
}
else
{
echo "您没有权限访问本页面";
}
?>

-------------------------------------------------------------------------------------------------------------------------

<?php
setcookie("username");
echo "注销成功";
?>


 

最后说明:

1.上面保证了token每次登录都会不一样,这回导致之前的token【既cookie】失效

2.cookie的有效期最好不超过一周

3.在客户端COOKIES中保存用户ID和一个加密码(规则只有我知道)

4.如果程序检测到客户端保存的COOKIES ID。就去跟数据库验证加密码,如果一致则返回对应用户的登录信息,否则返回FALSE

感觉效率和安全性都不是很好

1.用户访问每个页面都要去跟数据库验证一遍
2.加密码虽然规则很复杂,但是保存在客户端依然存在被破解的可能性

在php中protected是私有变量,若该成员被声明称protected(保护),则代表只能在该类和该类的子类中使用该字段,而const是一个常量它的值一旦赋值不能被改变,下面看两个例子。

const属性

用const属性定义的字段是一个常量,类中的常量和静态变量类似,不同之处就是常量的值一旦赋值不能被改变.const定义常量不需要加$符号,其结构形式如下:

const 常量名称  //常量名称不能用$符号

1、常量属性用 const 关键字来声明,不像常规属性一样用美元符$开头;
2、按照惯例,只能用大写字母来命名常量;
3、和全局变量一样,类常量一旦设置后就不能改变;
4、只包含基本数据类型的值,不能将一个对象指派给常量;
5、像静态属性一样,只能通过类而不能通过类的实例(对象)访问常量;
6、引用常量时不需要用美元符号为前导符;
7、给已经声明过的常量赋值会引起解析错误;
8、当需要在类的所有示例中都能访问某个属性,并且属性值无需改变时,应该使用常量。

 代码如下 复制代码

<?php 
    header('Content-type:text/html;charset=utf-8'); 
    class ShopProduct{ 
        const GUOWANPIAOPEN = "郭碗瓢盆"; 
        const BLOGTITLE = "美好生活的开始!"; 
        //... 
        public function sayHello(){ 
            print ShopProduct::GUOWANPIAOPEN."-".ShopProduct::BLOGTITLE."<br />"; 
            // 注意,每次引用常量都必须指向当前类(当前类名加两个冒号) 
            //print self::GUOWANPIAOPEN."-".self::BLOGTITLE."<br />"; 
            // 这里 self 关键字指向当前类,作用与上面一样 
        } 
    } 
 
    print ShopProduct::sayHello(); 
    //print ShopProduct::GUOWANPIAOPEN; 
?> 

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;
const CONNECT_OK = 1;//php5.3以后
class Connection { /* ... */ }
function connect() { /* ... */  }

#例子二

namespace MyProjectSubLevel;

const CONNECT_OK = 1;//php5.3以后
class Connection { /* ... */ }
function connect() { /* ... */  }

使用 `namespace 空间名` 来申明一个空间,在namespace之前除了declare语句不能有任何其他php语句,同时也不能有任何非php代码,连空格都不能有。

以下为错误的形式

 代码如下 复制代码

$a = 1;
namespace MyProject;
?>www.111cn.net
//Fatal error: Namespace declaration statement has to be the very first statement in the script...

 另外同一个命名空间是可以定义在多个文件中,这对于组织框架是非常有用的。即以同一个namespace MyProject;开头的文件,它们是同一个命名空间。所以注意文件之间可不要有相同的类/函数/常量名哦。

当然同一个文件也可以定义多个命名空间,不过非常不建议这样做的。(了解同一个文件定义多个命名空间)

5、命名空间如何使用
命名空间有三种使用形式:

. 非限定名称 -- 没有使用任何的分割符,直接使用类/函数/常量名,如:new Foo(); foo(); echo FOO; 当文件有使用命名空间时,

 代码如下 复制代码
<?php
namespace MyObject;
new Foo(); // 调用MyObjectFoo();
foo(); //调用MyObjectFoo();
echo FOO; //调用MyObjectFOO;     

 

. 非完全限定名称 -- 不是以分割符开头,如 new SubFoo(); 这种形式与非限定名称方式一样。

 代码如下 复制代码

<?php
namespace MyObject; new SubFoo(); //调用MyObjectSubFoo();

. 完全限定名称 -- 以分割符开头的方式,相当于操作系统里的绝对地址。如 new OtherNSFoo();

 代码如下 复制代码

<?php
namespace MyObject; new OtherNSFoo(); //调用OtherNsFoo(); 不管MyObject命名空间。

Tip: 对于函数和常量,还有一个特殊的地方(后备全局函数/常量)。

 代码如下 复制代码

<?php
namespace MyObject;
funcname(); //如果MyObjectFuncname存在则调用MyObjectFuncname(),否则试着调用funcname(); echo FOO; //同上。

对于类,也有一个特殊的地方。

 代码如下 复制代码

<?php
namespace MyObject;
new Foo(); //*如果MyObjectFoo存在,调用之,如果不存在,调用__autoload试着加载MyObjectFoo类进来。

           //注意对于类是不会去自动去调用全局作用域下的类的。*/

之前说了,命名空间还有一个用途-取别名。

 代码如下 复制代码

namespace MyObject;
use OtherNSSub as Other;
use OtherNSSub2; //相当于use OtherNSSub2 as Sub2;
use /MyClass;

new Foo(); //调用MyObjectFoo();
new OtherFoo(); //调用 OtherNSSubFoo();
new Sub2Foo(); //调用OtherNSSub2Foo();
new MyClass(); //调用MyClass();

6、动态命名空间

动态总是能让人摸不着头脑,然而又带来灵活性。命名空间同样可以使用动态语言特点,但要注意由于直接调用命名空间是编译时解析的,而动态特征并非编译时解析。所以一定要加前缀。如:

 代码如下 复制代码

namespace MyObjectSub;
new Foo(); //调用 MyObjectSubFoo(), 编译时已经解析成MyObjectSubFoo
$a = 'Foo';
new $a(); //调用的是Foo(),而不是MyObjectSubFoo()
$b = 'MyObjectSubFoo'; //等价于 MyObjectSubFoo
new $b(); //调用MyObjectSubFoo()
//如果使用双引号,要用\,如 $a = "\MyObject\Sub";

附1:同一个文件定义多个命名空间
方法有两种:

 代码如下 复制代码

namespace MyProject;
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }
namespace AnotherProject;
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }

方法一,记流水帐。

 代码如下 复制代码

namespace MyProject {

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }
}
namespace AnotherProject {
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }
}
namespace { //全局
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }
}

方法二,使用大括号把同一个命名空间的代码放在大括号里。这种方法,要求在大括号外不能有任何除了declare之外的代码。对于全局作用域的代码使用没有空间名的大括号包围起来

下面本文章来给大家介绍在php中成员变量的一些对比了,文章举了四个例子在这例子中分别对不同成员变量进行测试与获取操作,下面一起来看看。

有如下4个代码示例,你认为他们创建对象,并获得成员变量的速度排序是怎样的?

1:将成员变量设置为public,通过赋值操作给成员变量赋值,直接获取变量

 

 代码如下 复制代码

class Foo {
  public $id;
 }
 
 $data = new Foo;
 $data->id = 10;
 echo $data->id;2:将成员变量设置为public,通过构造函数设置成员变量的值,直接获取变量

        class Foo2 {
  public $id;
  public function __construct($id) {
   $this->id = $id;
  }
 }
 
 $data = new Foo2(10);
 echo $data->id;


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'
 2  NEW         $5 :4
 3  DO_FCALL_BY_NAME   0         
 4  ASSIGN         !0, $5
 5  ZEND_ASSIGN_OBJ   !0, 'id'
 6  ZEND_OP_DATA    10
 7  FETCH_OBJ_R   $9 !0, 'id'
 8  ECHO            $92:

 1  ZEND_FETCH_CLASS 4  :10 'Foo2'
 2  NEW               $11 :10
 3  SEND_VAL           10
 4  DO_FCALL_BY_NAME  1
 5  ASSIGN        !1, $11
 6  FETCH_OBJ_R   $14 !1, 'id'
 7  ECHO            $143:

 1  ZEND_FETCH_CLASS 4  :15 'Foo3'
 2  NEW            $16 :15
 3  SEND_VAL        10
 4  DO_FCALL_BY_NAME   1         
 5  ASSIGN         !2, $16
 6  ZEND_INIT_METHOD_CALL !2, 'getId'
 7  DO_FCALL_BY_NAME  0  $20    
 8  ECHO           $204:

 1  ZEND_FETCH_CLASS 4  :21 'Foo4'
 2  NEW            $22 :21
 3  END_VAL         10
 4  DO_FCALL_BY_NAME  1         
 5  ASSIGN           !3, $22
 6  FETCH_OBJ_R    $25 !3, 'id'
 7   ECHO      $25


根据上面的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语法结构的不要用函数,能使用内置函数的不要自己写,能用函数的不要用对象

在已知URL参数的情况下,我们可以根据自身情况采用$_GET来获取相应的参数信息($_GET[\\\'name\\\']);那,在未知情况下如何获取到URL上的参数信息呢?

第一种、利用$_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 ?>


路途漫漫...还有待继续挖掘...

[!--infotagslink--]

相关文章

  • phpems SQL注入(cookies)分析研究

    PHPEMS(PHP Exam Management System)在线模拟考试系统基于PHP+Mysql开发,主要用于搭建模拟考试平台,支持多种题型和展现方式,是国内首款支持题冒题和自动评分与教师评分相...2016-11-25
  • php中登录后跳转回原来要访问的页面实例

    在很多网站用户先访问一个要登录的页面,但当时没有登录后来登录了,等待用户登录成功之后肯定希望返回到上次访问的页面,下面我就来给大家介绍登录后跳转回原来要访问的页...2016-11-25
  • php中用curl模拟登录discuz以及模拟发帖

    本文章完美的利用了php的curl功能实现模拟登录discuz以及模拟发帖,本教程供参考学习哦。 代码如下 复制代码 <?php $discuz_url = &lsquo;ht...2016-11-25
  • JS使用cookie实现DIV提示框只显示一次的方法

    本文实例讲述了JS使用cookie实现DIV提示框只显示一次的方法。分享给大家供大家参考,具体如下:这里运用JavaScript的cookie技术,控制网页上的提示DIV只显示一次,也就是当用户是第一次打开网页的时候才显示,第二次自动隐藏起...2015-11-08
  • Ruby on Rails实现最基本的用户注册和登录功能的教程

    这里我们主要以has_secure_password的用户密码验证功能为中心,来讲解Ruby on Rails实现最基本的用户注册和登录功能的教程,需要的朋友可以参考下...2020-06-30
  • PHP中SSO Cookie登录分析和实现

    什么是SSO?单点登录SSO(Single Sign-On)是身份管理中的一部分。SSO的一种较为通俗的定义是:SSO是指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后,再访问其他应用中的受保护...2015-11-08
  • php有效防止同一用户多次登录

    【问题描述】:同一用户在同一时间多次登录如果不能检测出来,是危险的。因为,你无法知道是否有其他用户在登录你的账户。如何禁止同一用户多次登录呢? 【解决方案】 (1) 每次登录,身份认证成功后,重新产生一个session_id。 s...2015-11-24
  • PHP中SSO Cookie登录分析和实现

    什么是SSO?单点登录SSO(Single Sign-On)是身份管理中的一部分。SSO的一种较为通俗的定义是:SSO是指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后,再访问其他应用中的受保护...2015-11-08
  • vue实现用户登录切换

    这篇文章主要为大家详细介绍了vue实现用户登录切换,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-04-22
  • vue项目中js-cookie的使用存储token操作

    这篇文章主要介绍了vue项目中js-cookie的使用存储token操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-14
  • 修改mysql密码phpmyadmin不能登录

    出现phpmyadmin不能登录是我在修改我mysql服务器密码之后导致的,后来百度了相关的原因,原来是修改了mysql密码之后我们还需要在phpmyadmin目录中去修改config.inc.php中...2016-11-25
  • Vue-Element-Admin集成自己的接口实现登录跳转

    关于这个Vue-element-admin中的流程可能对于新的同学不是很友好,所以本文将结合实例代码,介绍Vue-Element-Admin集成自己的接口实现登录跳转,感兴趣的小伙伴们可以参考一下...2021-06-23
  • 浅谈js二维码扫码登录是什么原理

    这篇文章主要介绍了浅谈js二维码扫码登录是什么原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-04-13
  • 什么是cookie?js手动创建和存储cookie

    什么是cookie? cookie 是存储于访问者的计算机中的变量。每当同一台计算机通过浏览器请求某个页面时,就会发送这个 cookie。你可以使用 JavaScript 来创建和取回 cookie 的值。 有关cookie的例子: 名字 cookie 当访...2014-05-31
  • C#实现线程安全的简易日志记录方法

    这篇文章主要介绍了C#实现线程安全的简易日志记录方法,比较实用的功能,需要的朋友可以参考下...2020-06-25
  • python爬虫用request库处理cookie的实例讲解

    在本篇内容里小编给大家整理的是一篇关于python爬虫用request库处理cookie的实例讲解内容,有需要的朋友们可以学习参考下。...2021-02-21
  • phpmyadmin不能登录,无任何提示的问题解决

    昨天有一朋友说自己的phpmyadmin不能登录并且无任何提示了,问我怎么解决,下面我来分享一下关于phpmyadmin不能登录问题总结. phpmyadmin不能登录没有提示 解决方法:...2016-11-25
  • PHP中如何使用session实现保存用户登录信息

    session在php中是一个非常重要的东西,像我们用户登录一般都使用到session这个东西,相对于cookie来说session 要安全很多,同时我们购物车经常使用session来做临时的记录保存哦。使用session保存页面登录信息1、数据库连接...2015-10-21
  • 简单php cookie用户登录实例

    cookie 的用途之一是存储用户在特定网站上的密码和 id。另外,也用于存储起始页的首选项。在提供个人化查看的网站上,将要求阁下的网络浏览器利用阁下计算机硬驱上的少量...2016-11-25
  • 基于C#后台调用跨域MVC服务及带Cookie验证的实现

    本篇文章介绍了,基于C#后台调用跨域MVC服务及带Cookie验证的实现。需要的朋友参考下...2020-06-25