session与cookie

sessionid

session是存放在服务端的。当浏览器发起第一次请求,服务端会自动生成一个sessionid ,通过响应头发送给浏览器,浏览器再把sessionid存起来,下次请求的时候会带上sessionid,服务端会根据上传的sessionid去查找对应session

sessionid 是如何在客户端和服务端传递的?

服务器初次创建session的时候后返回session到客服端(在返回头(response)中有setCookie),浏览器会把sessionname->sessionid存到cooike中,同path下再次请求服务器时,会自动在请求头中带上cooike信息,服务器可以在_COOKIE中得取到想要的session

会话跟踪

记录会话信息的技术成为会话跟踪。常见的会话跟踪技术有Cookie、URL重写、隐藏表单域、Session.

session与cookie

cookie是保存在客户端的一些信息,分为:

会话cookie(临时)

临时数据,存放在浏览器内存中,当关闭浏览器后cookie删除

磁盘cookie(有过期时间)

持久化数据,以磁盘文件格式存放在系统磁盘中,不会随着浏览器关闭而删除,只有当设置的过期时间到的时候或者手动删除,才会被删除。

cookie具体操作

1. 客户端发出http请求(不包含cookie信息)
2. 服务器发出的响应中包含set-cookie,来通知客户端保存cookie信息。
3. 客户端收到响应,保存好cookie信息后,再在发出的http请求中加入cookie字段信息(包含设置指定的字段信息,不是全部账号密码信息)。
4. 服务器根据收到的请求,将cookie中的信息与之前的记录进行对比进行认证。

安全性

1.cookie信息添加在http请求头中,明文传输,有一定风险。
2.cookie的大小限制为4kb,一些复杂数据需求不适合

session

session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。但程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否包含了一个session标识 —— 称为session id。

session存放在哪里

服务器端的内存中。不过 session 可以通过特殊的方式做持久化管理(memcache,redis)

session在下列情况下被删除:

1.程序调用HttpSession.invalidate()
2.距离上一次收到客户端发送的session id时间间隔超过了session的最大有效时间
3.服务器进程被停止

php操作session、cookie

一个利用session进行登录验证的简单例子

使用tp5框架

简单的登录页面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<div class="login">    
<div class="login-top">       
<h1>LOGIN FORM</h1>       
<form action="/landingpage/test/login_test" method="post">           
<input type="text" name="username" value="User Id" onfocus="this.value =
'';" onblur="if (this.value == '') {this.value = 'User Id';}">           
<input type="password" name="password" value="password"
onfocus="this.value = '';" onblur="if (this.value == '') {this.value =
'password';}">           
<div class="forgot">               
<a href="#">forgot Password</a>               
<input type="submit" value="Login" >           
</div>       
</form>   
</div>   
<div class="login-bottom">       
<h3>New User &nbsp;<a href="#">Register</a>&nbsp Here</h3>   
</div>
</div>

登录操作

1
2
3
4
5
6
7
8
9
10
11
12
13
public function login_test(){
//        $data = $this->request->post();       
if(request()->isPost()){           
$username = input('username');           
$password = input('password');     

//进行账号密码校验           
// ......           

//通过校验后存储session            session('username',$username);           
$this->success('登录成功', url('landingpage/test/index'), '', 1); 

}

登出操作

1
2
3
4
public function logout(){    
Session::delete('username');   
return 'done';
}

登陆 , login_test 用session保存了用户名,并且session会自动产生一个sessionid,返回给前端,前端再保存到cookie中

页面跳转后打印一下 请求数据发现 客户端把自己的sessionid通过cookie附在了http请求中

这时服务端就能够通过这个sessionid 来比对服务端自己存起来的sessionid 来判断是哪个用户 以及其状态等;就可以进行一些比如退出等操作。

利用cookie存放数据

后端可以利用cookie让前端存一些内容,但是不安全

1
2
3
4
5
6
7
8
9
10
11
12
13
 public function login_test(){
//        $data = $this->request->post();       
if(request()->isPost()){           
$username = input('username');           
$password = input('password');           
//进行账号密码校验           
// ......           
//通过校验后存储session           
session('username',$username);           
Cookie::set('justtest','存一些垃圾玩意儿');           
$this->success('登录成功', url('landingpage/test/index'), '', 1);       
}   
}