Cookie and Session

1.HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话

由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理

cookie由服务器发送给客户端(浏览器),只要cookie没过期,以后每次客户端向这个服务器发送http请求时都会自动带上cookie信息。

2.查看某个网站颁发的Cookie很简单。在浏览器地址栏输入JavaScript:alert (document. cookie)就可以了.

Cookie具有不可跨域名性.

3.boolsetcookie ( string $name [, string$value = "" [,int$expire = 0 [,string$path = "" [,string$domain = "" [,bool$secure = false [,bool$httponly = false ]]]]]] );

cookie设置有一下几个选项:

name:相当于KEY键值,在一个网站内是唯一的 ,后面设置的同名 的 name会覆盖前面的 ;因此要删除一个 cookie值,可以把这个同名name的value值设为空(null);

value:相当于数组中的value值;通过$_COOKIE['name']查看访问;

exipire:是一个 unix timestamp格式,是一个以秒为单位的整数;setcookie('a','hello',time()+3600*24*7)将在7天后过期。如果设置为0或忽略,将在会话介绍后失效(浏览器关闭)。

path:该Cookie的使用路径;默认为当前目录及子目录下可用;设置为"/"时,则本域名下都可以访问;

domain:可以访问该Cookie的域名。如果设置为“.google.com”,则所有以“google.com”结尾的域名都可以访问该Cookie。注意第一个字符必须为“.”。

secure:设为true时将只能通过https访问;

httponly:设为true时将只能通过http协议访问,不能通过javascript等脚本语言访问。防止XSS攻击;

4.通过cookie可以记录用户登陆信息。

<?php
$username=$_POST['username'];
$password=md5($_POST['password']);
$autoLogin=(int)($_POST['autoLogin']);
$link=mysqli_connect('localhost','root','root','session');
mysqli_query($link,'set names utf8');
$username=mysqli_real_escape_string($link,$username);
$sql="select id,username from user WHERE username='{$username}' AND
password='{$password}'";
$result=mysqli_query($link,$sql);

if($result&&mysqli_affected_rows($link)==1){
    if($autoLogin){
        $expTime=time()+7*24*3600;
    }else{
        $expTime=0;
    }
    setcookie('isLogin',1,$expTime);
    setcookie('autoLogin',1,$expTime);
    setcookie('username',$username,$expTime);
    exit("<script>
alert('成功');
location.href='index.php';
</script>");
}else{
    exit("<script>
alert('失败');
location.href='index.php';
</script>");
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>login</title>
</head>
<body>
您好:
<?php
if(empty($_COOKIE['autoLogin'])){
    if(empty($_COOKIE['isLogin'])||empty($_COOKIE['username'])){
        echo "<a href='login.php'>请登录</a>";
    }
}else{
    echo $_COOKIE['username']."!!!!";
    echo "<a href='logout.php'>退出</a>";
}
?>

</body>
</html>
<?php
setcookie('isLogin','',time()-1);
setcookie('autoLogin','',time()-1);
setcookie('username','',time()-1);
header('location:index.php');

5.JS操作COOKIE:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>login</title>
</head>
<body>
<script>
    function set_cookie(name,value){
        var days=7;
        var expTime=new Date();
        expTime.setTime(expTime.getTime()+days*24*3600*1000);
        document.cookie=name+"="+decodeURI(value)+";expires="+expTime.toUTCString();
    }

    set_cookie('f',8886);

    function get_cookie(name){
        var arr;
        var reg=new RegExp("(^| )"+name+"=([^;]*)(;|$)");
        if(arr=document.cookie.match(reg)){
            return arr[2];
        }else{
            return null;
        }
    }

    function del_cookie(name){
        var  expTime=new Date();
        expTime.setTime(expTime.getTime()-1);
        var cookieValue=get_cookie(name);
        if(cookieValue!=null){
            document.cookie=name+"="+cookieValue+";expires="+expTime.toUTCString();
        }
    }

    alert(get_cookie('username'));

    del_cookie('a');
</script>

</body>
</html>
6. HTML5 web 存储,一个比cookie更好的本地存储方式;

localStorage['a1']=1;
    localStorage['a2']=22;
    localStorage['username']='king box';

    localStorage.setItem('aaa',5446);
    console.log(localStorage.getItem('aaa'));

    console.log(localStorage['username']);

    localStorage.removeItem('a1');

    var showStorage=function(){
        var storage=window.localStorage;
        for(var i= 0,len=storage.length;i<len;i++){
            console.log(storage.key(i)+":"+storage.getItem(storage.key(i)));
        }
    }

    showStorage();

    localStorage.clear();


</script>

二-----SESSION

Session是服务器端使用的一种记录客户端状态的机制,使用上比Cookie简单一些,相应的也增加了服务器的存储压力

Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。

如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。



 


大部分session机制都使用会话cookie来保存session_id,
而关闭浏览器后这个session_id就消失了,再次连接服务器时也就无法找到原来的session。
如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求头,
把原来的session_id发送给服务器,则再次打开浏览器仍然能够找到原来的session。


session工作原理_
session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(来保存信息。___
_当客户端请求创建一个session的时候,服务器首先检查客户端请求里是否已包含了一个session标识session_id,
如果已包含一个session_id则说明以前已经为此客户端创建过session,
服务器就按照session_id把这个session检索出来使用。_
如果客户端请求不包含session_id,则为此服务器创建一个session并且生成一个与此session相关联的session_id。
session_id的值是一个既不会重复,又不容易被找到规律以仿造的字符串,
这个session_id将被在本次响应中返回给客户端保存。_
保存这个session_id的方式可以采用cookie。一般这个cookie的名字都是类似于SEEESIONID

1.

<?php
session_start();

$_SESSION['username']='king';
$_SESSION['salary']=8426;
$_SESSION['age']=45;
$_SESSION['married']=true;
<?php
//键名不能为数字,只能是字符串;
session_start();
$_SESSION['a']=1;
$_SESSION['b']=2;

setcookie(session_name(),session_id(),time()+3600);
<?php
//使用URL重写;在php.ini中需要将session.use_cookie改为0
//session.use_trans_sid 改为1
session_start();
$_SESSION['aaaa']=1111111;
$_SESSION['bbbb']=22222;
?>
<a href="dump2.php?<?php echo session_name(); ?>=
<?php echo session_id();?>" >url format</a>
<br/>
<a href="dump2.php?<?php echo SID;?>">sid</a>

<?php
session_start();

$users=[
    'user1'=>'king1',
    'salary'=>12345.65,
    'age'=>56,
    'course'=>['a','b','history']
];
$_SESSION=$users;

<?php
// 初始化会话。
// 如果要使用会话,别忘了现在就调用:
session_start();

// 重置会话中的所有变量
$_SESSION = array();

// 如果要清理的更彻底,那么同时删除会话 cookie
// 注意:这样不但销毁了会话中的数据,还同时销毁了会话本身
if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
    );
}

// 最后,销毁会话
session_destroy();

<?php

session_start();
echo session_id();
var_dump($_SESSION);

<?php
session_id($_GET[session_name()]);
session_start();
var_dump($_SESSION);




 

以下是使用cookie跟踪session的示例代码: ```python from flask import Flask, request, make_response app = Flask(__name__) # 设置一个随机的密钥作为cookie的加密密钥 app.secret_key = 'random_secret_key' @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': # 获取用户提交的用户名和密码 username = request.form['username'] password = request.form['password'] # 验证用户名和密码是否正确 if username == 'admin' and password == 'password': # 如果验证通过,设置session变量 session['username'] = username return 'Logged in successfully!' else: return 'Invalid username or password' # 如果是GET请求,返回登录页面 return ''' <form method="post"> <p><input type="text" name="username"></p> <p><input type="password" name="password"></p> <p><input type="submit" value="Login"></p> </form> ''' @app.route('/profile') def profile(): # 检查session变量是否存在 if 'username' in session: return 'Hello, ' + session['username'] + '!' else: return 'You are not logged in' @app.route('/logout') def logout(): # 删除session变量 session.pop('username', None) return 'Logged out successfully!' # 设置cookie的过期时间为1小时 @app.before_request def make_session_permanent(): session.permanent = True app.permanent_session_lifetime = timedelta(hours=1) if __name__ == '__main__': app.run() ``` 在这个示例中,我们使用Flask框架来处理HTTP请求和响应。当用户登录时,我们设置了一个名为`username`的session变量,它存储用户的用户名。我们还设置了一个cookie,它包含了加密后的session ID,以便在后续的请求中识别用户。使用`session.pop()`函数可以删除session变量并在用户注销时从cookie中删除session ID。我们还使用了`before_request`钩子来设置cookie的过期时间,以便在一段时间后自动注销用户。 请注意,在实际应用中,您需要更加精细地控制cookiesession的设置,以确保系统的安全性和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值