深入分析理解session与cookie的作用

 更新时间:2016年11月25日 15:34  点击:1295
session与cookie在web开发中我们用到的不少了,那么关于session与cookie你有深入理解吗?今天我们就一起来看一篇关于深入分析理解session与cookie的作用的例子。

在Web发展历史中,session与cookie都是伟大的存在,其初衷都是为了记住用户在网站上的浏览信息,如果没有其他替代品的出现,几乎所有web站点都离不开session与cookie。

为什么需要

Http协议是无状态的,也就导致服务器无法分辨是谁浏览了网页。为了维持用户在网站的状态,比如登陆、购物车等,出现了先后出现了四种技术,分别是隐藏表单域、URL重写、cookie、session。

Cookie

为了解决Http协议无法维持状态的问题,1994年网景通讯的一名员工 Lou Montulli将 “magic cookies” 的概念应用到 Web 通讯中。他试图解决 Web 的第一个购物车应用,现在购物车成了购物网站的支柱。他的原始说明文档提供了 cookie 工作原理的基本信息,该文档后来被作为规范纳入到 RFC 2109(大多数浏览器的实现参考文档)中,最终被纳入到 RFC 2965 中。Montulli 也被授予 cookie 的美国专利。网景浏览器在它的第一个版本中就开始支持 cookie,现在所有 Web 浏览器都支持 cookie。(这里只介绍cookie与session)

是什么

cookie是浏览器保存在用户电脑上的一小段文本,用来保存用户在网站上的必要的信息。Web页面或服务器告诉浏览器按照一定的规范存储这些信息,并且在以后的所有请求中,这些信息就会自动加在http请求头中发送给服务器,服务器根据这些信息判断不同的用户。并且cookie本身是安全的。

如何创建

Web 服务器通过发送一个称为 Set-Cookie 的 HTTP 消息头来创建一个 cookie,Set-Cookie消息头是一个字符串,其格式如下(中括号中的部分是可选的):

Set-Cookie: value[; expires=date][; domain=domain][; path=path][; secure]
value

value 部分,通常是一个 name=value 格式的字符串。事实上,这种格式是原始规范中指定的格式,但是浏览器并不会对 cookie 值按照此格式来验证。实际上,你可以指定一个不含等号的字符串,它同样会被存储。然而,最常用的使用方式是按照 name=value 格式来指定 cookie 的值(大多数接口只支持该格式)。

发送回服务器的cookie只包含cookie设置的值,而不包含cookie的其他可选项,而且浏览器不会对cookie做任何更改,会原封不动的发送回服务器。当存在多个cookie时,用分号和空格隔开:

Cookie: name=value; name1=value1; name2=value2/pre>

cookie过期时间

如果不设置cookie过期时间,cookie会在会话结束后销毁,称为会话cookie。如果想将会话cookie设置为持久cookie,只需设置一下cookie的过期时间即可,该选项的值是一个 Wdy, DD-Mon-YYYY HH:MM:SS GMT 日期格式的值。注意这个失效日期则关联了以 name-domain-path-secure 为标识的 cookie。要改变一个 cookie 的失效日期,你必须指定同样的组合。

持久cookie是无法改成会话cookie,除非删除这个cookie,然后重新建立这个cookie。

domain 选项

domian选项设置了cookie的域,只有发向这个域的http请求才能携带这些cookie。一般情况下domain会被设置为创建该cookie的页面所在的域名。

像 Yahoo! 这种大型网站,都会有许多 name.yahoo.com 形式的站点(例如:my.yahoo.com, finance.yahoo.com 等等)。将一个 cookie 的 domain 选项设置为 yahoo.com,就可以将该 cookie 的值发送至所有这些站点。浏览器会把 domain 的值与请求的域名做一个尾部比较(即从字符串的尾部开始比较),并将匹配的 cookie 发送至服务器。

path 选项

path选项和domain选项类似,只有包含指定path的http请求才能携带这些cookie。这个比较通常是将 path 选项的值与请求的 URL 从头开始逐字符比较完成的。如果字符匹配,则发送 Cookie 消息头,例如:

set-cookie:namevalue;path=/blog
所以包含/blog的http请求都会携带cookie信息。

secure 选项

该选项只是一个标记而没有值。只有当一个请求通过 SSL 或 HTTPS 创建时,包含 secure 选项的 cookie 才能被发送至服务器。这种 cookie 的内容具有很高的价值,如果以纯文本形式传递很有可能被篡改。

事实上,机密且敏感的信息绝不应该在 cookie 中存储或传输,因为 cookie 的整个机制原本都是不安全的。默认情况下,在 HTTPS 链接上传输的 cookie 都会被自动添加上 secure 选项。

HTTP-Only

HTTP-Only 的意思是告之浏览器该 cookie 绝不能通过 JavaScript 的 document.cookie 属性访问。设计该特征意在提供一个安全措施来帮助阻止通过 JavaScript 发起的跨站脚本攻击 (XSS) 窃取 cookie 的行为。

JavaScript 操作 cookie

在 JavaScript 中通过 document.cookie 属性,你可以创建、维护和删除 cookie。创建 cookie 时该属性等同于 Set-Cookie 消息头,而在读取 cookie 时则等同于 Cookie 消息头。

删除cookie

会话 cooke (Session cookie) 在会话结束时(浏览器关闭)会被删除。
持久化 cookie(Persistent cookie)在到达失效日期时会被删除。
如果浏览器中的 cookie 数量达到限制,那么 cookie 会被删除以为新建的 cookie 创建空间。
session
session的作用和cookie差不多,也是用来解决Http协议不能维持状态的问题。但是session只存储在服务器端的,不会在网络中进行传输,所以较cookie来说,session相对安全一些。但是session是依赖cookie的,当用户访问某一站点时,服务器会为这个用户产生唯一的session_id,并把这个session_id以cookie的形式发送到客户端,以后的客户端的所有请求都会自动携带这个cookie(前提是浏览器支持并且没有禁用cookie)。

用下面这个图来了解下session的工作原理:


 

禁用cookie时如何使用session

有些时候,为了安全浏览器会禁用cookie,这时可以用传参的方式将session_id发送到服务器,session可以照常工作。

删除session

会话关闭后,session会自动失效,如果想手动删除session,可以在服务器端编程实现。如PHP是这样做的

$_SESSION = array();
session_destory();

有序的数组打印或排序对于php来讲非常的简单了这里整理了几个不同语言的做法的实现代码,具体的我们一起来看这篇php中有序的数组打印或排序的例子吧。


最近有个面试题挺火的——把俩个有序的数组打印或排序。刚看到这个题的时候也有点蒙,最优的算法肯定要用到有序的特性。

思考了一会发现也不是很难,假如数组是正序排列的,可以同时遍历俩个数组,将小的值进行排序,最后会遍历完一个数组,留下一个非空数组,而且剩下的值肯定大于等于已经排好序的最大值。

PHP代码之

<?php
    function sort_arr($a,$b) {
        $temp = array();
        while ($a&&$b) {
            if($a['0']<$b['0']) {
                $temp[] = array_shift($a);
            } else {
                $temp[] = array_shift($b);
            }
        }
        if(!empty($a)) { $temp = array_merge($temp, $a); }
        if(!empty($b)) { $temp = array_merge($temp, $b); }
        return $temp;
    }
    $a = array(1,2,3,4,5,6);
    $b = array(2,3,4,10,10,10,10);
    sort_arr($a, $b);
?>
 

Python 代码之

def fib(a,b):
    len_a = len(a)
    c = []
    while len(a) and len(b):
        if a[0] > b[0]:
            c.append(b.pop(0))
        else:
            c.append(a.pop(0))
    
    if len(a):
        c = c+a 
    
    if len(b):
        c = c+b
 
    i=0
    while i<len(c):
        print(c[i])
        i = i+1    
 
 
a = [1,2,3,4,5]
b = [2,3,4,5,6,7,8,9]
 
fib(a,b)

C代码之


#include &amp;lt;stdio.h&amp;gt;;
int *sort(int a[], int b[], int a_len, int b_len) {
    int *temp = malloc(a_len+b_len);
 
    int i=0; //标注a数组
    int j=0; //标注b数组
    int m=0; //标注新数组
    
    while (i&amp;lt;a_len&amp;amp;&amp;amp;j&amp;lt;b_len) { //重新排序 if(a[i]&amp;lt;b[j]) {
            temp[m++] = b[j++];
        } else {
            temp[m++] = a[i++];
        }
    }
    
    //将剩余的数字放在新数组后面(剩余的肯定是前面的数字大)
    if(i&amp;lt;a_len) {
        for (; i&amp;lt;a_len; i++) {
            temp[m++] = a[i];
        }
    }
    if(j&amp;lt;b_len) {
        for (; j&amp;lt;b_len; j++) {
            temp[m++] = b[j];
        }
    }
    
    return temp;
}
 
int main(int argc, const char * argv[]) {
    int a[4] = {2,3,11,89};
    int b[6] = {4,6,9,10,22,55};
    
    int a_len = sizeof(a) / sizeof(a[0]);
    int b_len = sizeof(b) / sizeof(b[0]);
    
    int *c = sort(a, b, a_len, b_len);
    
    int y = 0;
    for (; y&amp;lt;a_len+b_len; y++) {
        printf("%d ", c[y]);
    }
    
    return 0;
}

GO代码之


package main
 
import "fmt"
 
func main() {
    var a = [5]int{1, 2, 3, 4, 5}
    var b = [8]int{4, 5, 6, 7, 89, 100, 111, 112}
    var len_a = len(a)
    var len_b = len(b)
    var c = make([]int, len_a+len_b)
 
    var j = 0 //标注a数组
    var k = 0 //标注b数组
    var h = 0 //标注新数组
 
        
    for j &amp;lt; len_a &amp;amp;&amp;amp; k &amp;lt; len_b {
        if a[j] &amp;gt; b[k] {
            c[h] = b[k]
            h++
            k++
        } else {
            c[h] = a[j]
            h++
            j++
        }
    }
 
    if j &amp;lt; len_a {
        for i := j; i &amp;lt; len_a; i++ {
            c[h] = a[i]
            h++
        }
    }
 
    if k &amp;lt; len_b {
        for i := k; i &amp;lt; len_b; i++ {
            c[h] = b[i]
            h++
        }
    }
 
    Print(c, "c")
 
}
 
/**
 * [Print array]
 * @param {[type]} o    []int  [array]
 * @param {[type]} name string [array name]
 */
func Print(o []int, name string) {
    fmt.Printf("%s: ", name)
 
    for _, v := range o {
        fmt.Printf("%d ", v)
    }
 
    fmt.Printf("\n")
}

二分法查找在高级点的开发可能会用到了,当然在大公司找工作时都会有面试题是这种了,下面我们来看一篇关于二分法查找在php中实现方法,具体的细节如下所示。

二分法(dichotomie) 即一分为二的方法. 设[a,b]为R的闭区间. 逐次二分法就是造出如下的区间序列([an,bn]):a0=a,b0=b,且对任一自然数n,[an+1,bn+1]或者等于[an,cn],或者等于[cn,bn],其中cn表示[an,bn]的中点.

例子1


header('Content-Type: text/html; charset=utf-8;');

$arr = array(2,33,22,1,323,321,28,36,90,123);
sort($arr);

//二分法查找
echo $index = binarySearch($arr,321);

function binarySearch($arr,$key){
 $len = count($arr);
 $mid = -1;
 $start = 0;
 $end   = $len-1;

 while($start<=$end){
  $mid = (int)(($start+$end)/2);
  echo $mid."\n";
  if($arr[$mid] == $key){
   return $mid;
  }else if($arr[$mid] < $key){
   $start = $mid+1;
  }else if($arr[$mid] > $key){
   $end = $mid-1; 
  }
 }
}


例子2

<?php
//search函数 其中$array为数组,$k为要找的值,$low为查找范围的最小键值,$high为查找范围的最大键值
function search($array, $k, $low=0, $high=0) 
{
    if(count($array)!=0 and $high == 0)     //判断是否为第一次调用
    {
        $high = count($array);
    }
    if($low <= $high)        //如果还存在剩余的数组元素
    {
        $mid = intval(($low+$high)/2);      //取$low和$high的中间值
        if ($array[$mid] == $k)       //如果找到则返回
        {
            return $mid;
        }
        elseif ($k < $array[$mid])      //如果没有找到,则继续查找
        {
            return search($array, $k, $low, $mid-1);
        }
        else
        {
            return search($array, $k, $mid+1, $high);
        }
    }
    return -1;
}
$array = array(4,5,7,8,9,10);       //测试search函数
echo search($array, 8);        //调用search函数并输出查找结果
?>

php编译安装碰到各种的问题了,我们这里整理了一篇关于解决php编译中遇到各种error办法的文章,希望此文章能够为各位带来帮助呀。
1) Configure: error: xml2-config not found. Please check your libxml2 installation.

 

Solutions :

 

Quote:

 

 

 

# yum install libxml2 libxml2-devel

 

 

 

2) Checking for pkg-config… /usr/bin/pkg-config configure: error: Cannot find OpenSSL’s <evp.h>

 

Solutions :

 

Quote:

 

 

 

# yum install openssl openssl-devel

 

 

 

3) Configure: error: Please reinstall the BZip2 distribution

 

Solutions :

 

Quote:

 

 

 

# yum install bzip2 bzip2-devel

 

 

 

4) Configure: error: Please reinstall the libcurl distribution -easy.h should be in <curl-dir>/include/curl/

 

Solutions :

 

Quote:

 

 

 

# yum install curl curl-devel

 

 

 

5) Configure: error: libjpeg.(also) not found.

 

Solutions :

 

Quote:

 

 

 

# yum install libjpeg libjpeg-devel

 

 

 

6) Configure: error: libpng.(also) not found.

 

Solutions :

 

Quote:

 

 

 

# yum install libpng libpng-devel

 

 

 

7) Configure: error: freetype.h not found.

 

Solutions :

 

Quote:

 

 

 

#yum install freetype-devel

 

 

 

8) Configure: error: Unable to locate gmp.h

 

Solutions :

 

Quote:

 

 

 

# yum install gmp-devel

 

 

 

9) Configure: error: Cannot find MySQL header files under /usr. Note that the MySQL client library is not bundled anymore!

 

Solutions :

 

Quote:

 

 

 

# yum install mysql-devel

 

 

 

10) Configure: error: Please reinstall the ncurses distribution

 

Solutions :

 

Quote:

 

 

 

# yum install ncurses ncurses-devel

 

 

 

11) Checking for unixODBC support… configure: error: ODBC header file ‘/usr/include/sqlext.h’ not found!

 

Solutions :

 

Quote:

 

 

 

# yum install unixODBC-devel

 

 

 

12) Configure: error: Cannot find pspell

 

Solutions :

 

Quote:

 

 

 

# yum install pspell-devel

 

 

 

13) configure: error: mcrypt.h not found. Please reinstall libmcrypt.

 

Solutions :

 

Quote:

 

 

 

# yum install libmcrypt libmcrypt-devel

 

 

 

14) Configure: error: snmp.h not found. Check your SNMP installation.

 

Solutions :

 

Quote:

 

 

 

# yum install net-snmp net-snmp-devel

 

 

 

15)configure: error: Please reinstall libmhash – I cannot find mhash.h

 

 

 

#yum install mhash-devel
PHP使用星号替代用户名手机和邮箱这个在许多的活动界面会看到如淘宝的购物界面中的一些客户的支付宝号都是隐藏掉的哦,下面我们来看一下它的使用方法吧。

<?php

function hideStar($str) { //用户名、邮箱、手机账号中间字符串以*隐藏
    if (strpos($str, '@')) {
        $email_array = explode("@", $str);
        $prevfix = (strlen($email_array[0]) < 4) ? "" : substr($str, 0, 3); //邮箱前缀
        $count = 0;
        $str = preg_replace('/([\d\w+_-]{0,100})@/', '***@', $str, -1, $count);
        $rs = $prevfix . $str;
    } else {
        $pattern = '/(1[3458]{1}[0-9])[0-9]{4}([0-9]{4})/i';
        if (preg_match($pattern, $str)) {
            $rs = preg_replace($pattern, '$1****$2', $str); // substr_replace($name,'****',3,4);
        } else {
            $rs = substr($str, 0, 3) . "***" . substr($str, -1);
        }
    }
    return $rs;
}
?>

<?php
$account = "111cn.net";
$email = "416148489@qq.com";
$phone = "18005152525";
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>演示:PHP以星号隐藏用户名手机和邮箱</title>
        <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>
        <link rel="stylesheet" type="text/css" href="http://www.111cn.net  /jquery/css/common.css" />
        <style type="text/css">
        </style>
    </head>
    <body>
        <div class="head">
            <div class="head_inner clearfix">
                <ul id="nav">
                    <li><a href="http://www.111cn.net  ">首 页</a></li>
                    <li><a href="http://www.111cn.net  /templates">网站模板</a></li>
                    <li><a href="http://www.111cn.net  /js">网页特效</a></li>
                    <li><a href="http://www.111cn.net  /php">PHP</a></li>
                    <li><a href="http://www.111cn.net  /site">精选网址</a></li>
                </ul>
                <a class="logo" href="http://www.111cn.net  "><img src="http://www.111cn.net  /Public/images/logo.jpg" alt="素材火logo" /></a>
            </div>
        </div>
        <div class="container">
            <div class="demo">
                <h2 class="title"><a href="http://www.111cn.net  /js/548.html">教程:PHP以星号隐藏用户名手机和邮箱</a></h2>

                <table width="100%" class="table_parameters">
                    <tr class="tr_head">
                        <td>账号</td>
                        <td>邮箱</td>
                        <td>手机</td>
                    </tr>
                    <tr>
                        <td><?php echo $account; ?></td>
                        <td><?php echo $email; ?></td>
                        <td><?php echo $phone; ?></td>
                    </tr>
                    <tr class="red">
                        <td><?php echo hideStar($account); ?></td>
                        <td><?php echo hideStar($email); ?></td>
                        <td><?php echo hideStar($phone); ?></td>
                    </tr>
                </table>
            </div>
        </div>
      
    </body>
</html>

[!--infotagslink--]

相关文章

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

    PHPEMS(PHP Exam Management System)在线模拟考试系统基于PHP+Mysql开发,主要用于搭建模拟考试平台,支持多种题型和展现方式,是国内首款支持题冒题和自动评分与教师评分相...2016-11-25
  • PHP session_start()很慢问题分析与解决办法

    本文章来给各位同学介绍一下关于PHP session_start()很慢问题分析与解决办法,希望碰到此问题的同学可进入参考。 最近在做东西的时候发现一个问题 有一个接口挂...2016-11-25
  • JS使用cookie实现DIV提示框只显示一次的方法

    本文实例讲述了JS使用cookie实现DIV提示框只显示一次的方法。分享给大家供大家参考,具体如下:这里运用JavaScript的cookie技术,控制网页上的提示DIV只显示一次,也就是当用户是第一次打开网页的时候才显示,第二次自动隐藏起...2015-11-08
  • PHP分布式框架如何使用Memcache同步SESSION教程

    本教程主要讲解PHP项目如何用实现memcache分布式,配置使用memcache存储session数据,以及memcache的SESSION数据如何同步。 至于Memcache的安装配置,我们就不讲了,以前...2016-11-25
  • PHP中SSO Cookie登录分析和实现

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

    因此,正确的原子操作是真正被执行过的。是物理执行。在当前事务中确实能看到插入的记录。最后只不过删除了。但是AUTO_INCREMENT不会应删除而改变值。1、为什么auto_increament没有回滚?因为innodb的auto_increament的...2014-05-31
  • PHP中SSO Cookie登录分析和实现

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

    这篇文章主要介绍了vue项目中js-cookie的使用存储token操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-14
  • 详解C#中的session用法

    这篇文章主要介绍了C#中的session用法 ,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • Python3使用Selenium获取session和token方法详解

    这篇文章主要介绍了Python3使用Selenium获取session和token方法详解,需要的朋友可以参考下...2021-02-17
  • Mysql索引会失效的几种情况分析

    索引并不是时时都会生效的,比如以下几种情况,将导致索引失效: 1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)  注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引 ...2014-06-07
  • 什么是cookie?js手动创建和存储cookie

    什么是cookie? cookie 是存储于访问者的计算机中的变量。每当同一台计算机通过浏览器请求某个页面时,就会发送这个 cookie。你可以使用 JavaScript 来创建和取回 cookie 的值。 有关cookie的例子: 名字 cookie 当访...2014-05-31
  • python 爬取京东指定商品评论并进行情感分析

    本文主要讲述了利用Python网络爬虫对指定京东商城中指定商品下的用户评论进行爬取,对数据预处理操作后进行文本情感分析,感兴趣的朋友可以了解下...2021-05-28
  • Underscore源码分析

    Underscore 是一个 JavaScript 工具库,它提供了一整套函数式编程的实用功能,但是没有扩展任何 JavaScript 内置对象。这篇文章主要介绍了underscore源码分析相关知识,感兴趣的朋友一起学习吧...2016-01-02
  • 编程新手必须掌握的:session与cookie的区别

    session和cookie是网站浏览中较为常见的两个概念,也是比较难以辨析的两个概念,但它们在点击流及基于用户浏览行为的网站分析中却相当关键。基于网上一些文章和资料的参阅,及作者个人的应用体会,对这两个概念做一个简单的阐述...2013-09-11
  • python爬虫用request库处理cookie的实例讲解

    在本篇内容里小编给大家整理的是一篇关于python爬虫用request库处理cookie的实例讲解内容,有需要的朋友们可以学习参考下。...2021-02-21
  • PHP中如何使用session实现保存用户登录信息

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

    Google是这样介绍PageRank的:   Google 出类拔萃的地方在于专注开发“完美的搜索引擎”,联合创始人拉里&middot;佩奇将这种搜索引擎定义为可“确解用户...2017-07-06
  • Vue使用axios引起的后台session不同操作

    这篇文章主要介绍了Vue使用axios引起的后台session不同操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-14
  • 基于C#后台调用跨域MVC服务及带Cookie验证的实现

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