关于PHP和javaScript中共用cookie与session的研究

  •   
  • 5350
  • PHP
  • 2
  • super_dodo
  • 2015/10/13

关于cookie和session的机制就不多记录,直接进入主题。

最近遇到一个问题主要是为了实现用户分享出一篇文章后,他们的朋友阅读该文章,首次阅读的时候他得到奖励,他朋友多次刷新的时候就不予以赠送。(有多种方法可实现该功能需求,A借助数据库记录判断(开销太大且阅读者需要标识ip等。不建议用) B,利用本地缓存localStroage和ajax实现,C本地缓存和url跳转参数实现,D使用cookie和localStroage如下。)

想了一些办法,使用到localStroage和页面的cookie等方法。其中一个环节主要是用想让php和js共用cookie然后实现一个奖励的标识的功能。

那么首先是研究cookie的共用吧:前提是假设浏览器能够接收所有cookie.先写几个公共常用的js操作cookie的方法:js中设置cookie、删除cookie、读取cookie:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
//设置Cookie
function setCookie(name, value, iDay){
    var oDate = new Date();
    oDate.setDate(oDate.getDate()+iDay);
    document.cookie = name+'='+value+';expires='+oDate;
}
 
//获取Cookie
function getCookie(name){
    //cookie 格式:name=kk; pass=123
    var arr = document.cookie.split('; ');
    for( var i=0;i<arr.length;i++ ){
        var arr2 = arr&#91;i&#93;.split('=');
        if( arr2&#91;0&#93; == name ){
            return arr2&#91;1&#93;;
        }
    }
    return '';
}
 
//删除Cookie
function removeCookie(name){
    setCookie(name,'1',-1);//设置过期时间为负值(小于当前时间就OK)
}
 
&#91;/php&#93;
 
 
js中怎么设置和获得cookie:
&#91;php&#93;
//js中怎么设置和获得cookie
window.onload = function() {
    alert( document.cookie );
    setCookie('dodo', 'dodo', 3600);
    setCookie('book', 'book', 3600);
    alert(document.cookie);
}
 
//打印出来的结果是这个样子的:dodo=dodo; book=book;
//注意:两个值之间的分割是一个分号+一个空格
&#91;/php&#93;
 
 
4,php中接收cookie:
&#91;php&#93;
//php中接收cookie
if(isset($_COOKIE&#91;'dodo'&#93;)){
    echo $_COOKIE&#91;'dodo'&#93;;
}
 
if(isset($_COOKIE&#91;'book'&#93;)){
    echo $_COOKIE&#91;'book'&#93;;
}
 
&#91;/php&#93;
在网页中打印出了这个值,这说明了我们可以通过cookie来实现js和php的通信,也说明了js和php共用cookie的原理。
 
 
关于js和php中session的共用,这个得在设置session页面里面下一个种子,然后通过js来获取,之后在php页面再获取到之后重新设置,这样的话花销比较大,一般需要的话最好是通过cookie来了,而且session的共用的机制个人的做法不同,这里不做记录是因为我觉得如果可以互通cookie的话那么就用cookie了,因为session本身也是要依赖于cookie的,所以其本质一样但是实现的时候花销后者还大些,所以我觉得没有必要故不做记录。。。。
 
 
贴一段我自己的代码示例:
&#91;php&#93;
<script type="text/javascript">
    //设置Cookie
    function setCookie(name, value, iDay){
        var oDate = new Date();
        oDate.setDate(oDate.getDate()+iDay);
        document.cookie = name+'='+value+';expires='+oDate;
    }
    //获取Cookie
    function getCookie(name){
        //cookie 格式:name=kk; pass=123
        var arr = document.cookie.split('; ');
        for( var i=0;i<arr.length;i++ ){
            var arr2 = arr&#91;i&#93;.split('=');
            if( arr2&#91;0&#93; == name ){
                return arr2&#91;1&#93;;
            }
        }
        return '';
    }
    //删除Cookie
    function removeCookie(name){
        setCookie(name,'1',-1);//设置过期时间为负值(小于当前时间就OK)
    }
 
    //检测是否支持本地存储
    if(window.localStorage){
        var dodobook = localStorage.dodobook;
        var curUrl = document.URL;      //得到当前的url
        if(!dodobook){  //不存在本地存储的情况下,去请求增加用户金钱的接口
            alert('这是你第一次阅读该文章...恭喜你...');
            var taskId = "<?php echo $_GET&#91;'task_id'&#93;;?>";
            setCookie('dodobook_task_id',taskId,604800);    //有效期一周7天
            localStorage.dodobook = curUrl;
        }else{
            alert('你已经是第二次重复阅读该页面了...阅读无效...');
            setCookie('dodobook_task_id','0',604800);   //有效期一周7天
        }
    }else{
        alert('页面不支持HTML5的localStorage功能...阅读无效...');
    }
</script>
 
//php的代码
$dodo_flag = isset($_COOKIE['dodobook_task_id']) ? $_COOKIE['dodobook_task_id'] : '0';
echo $dodo_flag;

每天说一句:念念不忘、必有回响。。。。加油!!