跨域ajax请求如何保持session状态

1.提出问题:

Ajax在跨域请求的时候,session会话会丢失,每请求一次都会生成一个新的session_id,即当成一个新的会话,无法跟踪用户的状态,这个问题该如何解决呢?

2.解决办法:

第一步:前端ajax部分:

$.ajax({
  url: 'http://my.test.com/server.php', //跨域 
  xhrFields:{withCredentials: true}, // 发送凭据,表示保持会话 
  dataType: 'json', 
  type: 'post', 
  data: {'name':'fdipzone'},          
  success:function(ret){ 
    if(ret['success']==true){ 
     alert('cookie:' + ret['cookie']); 
   } 
  } 
});

第二步:后端服务部分(server.php):

//允许跨域访问的来源域名,如:http://localhost:8080,只能设置一个,
//以下设置的是任意来源
header('Access-Control-Allow-Origin:'.$_SERVER['HTTP_ORIGIN']);
//允许跟踪会话,保持session或cookie
header('Access-Control-Allow-Credentials:true');
//允许请求的方式:GET和POST
header('Access-Control-Allow-Methods:GET,POST');
//允许的headers
header('Access-Control-Allow-Headers:x-requested-with,content-type');

第三步:到处前后端就实现了跨域访问,并且能够跟踪会话,大功告成!

注意事项:

1.当Access-Control-Allow-Credentials设为true时,不能如下这么设置,必须绑定一个具体的域名:
header('Access-Control-Allow-Origin:*');//不对
2.在vue.js框架下实现跨域时:在main.js中开启跨域配置即可:
Vue.http.options.emulateJSON = true
Vue.http.interceptors.push(function (request, next) {     
   request.credentials = true     
   next()
})

 

 

网络TCP建立连接为什么需要三次握手而结束要四次

举个打电话的例子:

A : 你好我是A,你听得到我在说话吗

B : 听到了,我是B,你听到我在说话吗

A : 嗯,听到了

建立连接,开始聊天!

8
direct

为什么TCP协议终止链接要四次?

1、当主机A确认发送完数据且知道B已经接受完了,想要关闭发送数据口(当然确认信号还是可以发),就会发FIN给主机B。

2、主机B收到A发送的FIN,表示收到了,就会发送ACK回复。

3、但这是B可能还在发送数据,没有想要关闭数据口的意思,所以FIN与ACK不是同时发送的,而是等到B数据发送完了,才会发送FIN给主机A。

4、A收到B发来的FIN,知道B的数据也发送完了,回复ACK, A等待2MSL以后,没有收到B传来的任何消息,知道B已经收到自己的ACK了,A就关闭链接,B也关闭链接了。

A为什么等待2MSL,从TIME_WAIT到CLOSE?

在Client发送出最后的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。

这个网上转载的例子不错:

三次握手:
A:“喂,你听得到吗?”A->SYN_SEND

B:“我听得到呀,你听得到我吗?”应答与请求同时发出 B->SYN_RCVD | A->ESTABLISHED

A:“我能听到你,今天balabala……”B->ESTABLISHED

四次挥手:
A:“喂,我不说了。”A->FIN_WAIT1

B:“我知道了。等下,上一句还没说完。Balabala…..”B->CLOSE_WAIT | A->FIN_WAIT2

B:”好了,说完了,我也不说了。”B->LAST_ACK

A:”我知道了。”A->TIME_WAIT | B->CLOSED

A等待2MSL,保证B收到了消息,否则重说一次”我知道了”,A->CLOSED
链接:https://zhuanlan.zhihu.com/p/21940234

参考:http://blog.chinaunix.net/uid-25002135-id-3314682.html
http://www.cnblogs.com/vamei/archive/2012/12/16/2812188.html

Thinkphp5 同时使用Mysql和MongoDB数据库

项目需要Thinkphp5同时使用Mysql和Mongodb数据库,本篇文章详细介绍Thinkphp5 如何同时使用Mysql和MongoDB数据库。

官方文档:https://www.kancloud.cn/manual/thinkphp5/167865

一、在database.php配置默认数据库连接

4
‘type’           => ‘mysql’,
‘hostname’       => ‘服务器IP地址’,
‘database’       => ‘数据库名’,
‘username’       => ‘用户名’,
‘password’       => ‘密码’,
‘hostport’       => ‘数据库端口’,

二、在config.php配置第二个数据库连接

5
‘db_mongo’ => [
‘type’    =>   ‘\think\mongo\Connection’,
‘hostname’    =>   ‘数据库服务器IP地址’,
‘database’    =>   ‘数据库名’,
‘username’    =>   ‘用户名’,
‘password’     =>   ‘密码’,

‘hostport’    =>   27017,

],
Thinkphp5扩展MongoDB可参考:Thinkphp5 扩展 MongoDB 详解

三、数据库使用

//默认数据库读取数据
$test = Db::name(“test”)->select();
//第二个数据库读取数据

$test1=Db::connect(“db_mongo”)->name(“test”)->select();