我用GUZZLE创建httpclient模拟请求自己的phpweb项目,确认web项目是有session_start()的,模拟登陆请求成功后,response-header里有Set-Cookie,当我用set-cookie里的PHPSESSID去请求下一个页面时,seesion不可用,到服务端查看session_save_path里确实没有对应的session。
我用浏览器访问登陆后拿到cookie,再写到代码里就可以通过,说明请求代码没问题。而且浏览器拿到的cookie在服务端的session_save_path里是有对应的session的。
相关代码
$client = new Client([
'base_uri' => 'http://my.domain.com',
]);
$response = $client->request('POST','/?action=sys&opt=login',[
'action'=>'login',
'uName'=>'myUName',
'uPass'=>'myPwd',
]);
print_r($response->getHeader('Set-Cookie'));//此处打印正常Array([0] => PHPSESSID=22fosfolsvoqardv5atdg0cnr2; expires=Sat, 19-Jan-2019 03:45:38 GMT; path=/; domain=my.domain.com)
$cookie = substr((explode(';',($response->getHeader('Set-Cookie'))[0]))[0],10);
$jar = CookieJar::fromArray(['PHPSESSID'=>$cookie],'my.domain.com');
$response = $client->request('GET', '/?action=game&opt=gameindex&type=add',[
'cookies'=>$jar
]);
可以确认服务端的session保存路径里没有response-header返回cookie里对应的session,也没有另外设置过session名,通过浏览器拿到的cookie是可以用的。求各位大神指出错误,感谢。
1 回答
呼如林
TA贡献1798条经验 获得超3个赞
还是自问自答,好像sf里phper非常少,
我这里的通过xdebug的远程调试发现,我web代码里有一个Session['uName']判断,当他为空时会destory_session()删除服务器的session文件。
我这里是有一个写法错误
$response = $client->request('POST','/?action=sys&opt=login',[
'action'=>'login',
'uName'=>'myUName',
'uPass'=>'myPwd',
]);
这里应该修改为
$response = $client->request('POST','/?action=sys&opt=login',[
'form_params' => [
'action'=>'login',
'uName'=>'myUName',
'uPass'=>'myPwd',
]
]);
post的参数才会被正确发送。Well done!
- 1 回答
- 0 关注
- 1012 浏览
添加回答
举报
0/150
提交
取消