开发者社区> 问答> 正文

curl模拟session登陆出现小问题?报错

我获取时得刷新一次才不报错,请大家看下面代码

在localhost/session/下有下面4个文件

表单文件form.php

<html>
<head>
<title>表单提交</title>
<meta charset='utf-8'>
</head>
<body>
<form name='curl' method='post' action='action.php'>
用户名:<input type='text' name='user' ><br/>
密码:<input type='password' name='pwd'><br/>
<input type='submit' name='sub' value="sub">
</form>
</body>
</html>
表单提交处理文件action.php
<?php
header("content-type:text/html;charset='utf-8'");
session_start();
$u=@$_POST['user'];
$p=@$_POST['pwd'];
if($u=='hkui'&&$p=='123'){
   $_SESSION['keykey']='okokok';
    header("location:main.php");
    echo "欢迎,有权限访问action.php";
//    print_r($_SESSION);

}else{
	echo "无权访问";

}
?>
登陆验证后跳转到的文件main.php
<?php
header("content-type:text/html;charset='utf-8'");
session_start();
if(@$_SESSION['keykey']=='okokok')
{
echo "<br/>main.php","欢迎访问";
}else{
echo "<br/>无权访main.php面";
}
?>
最后一个模拟session登陆的文件curl.php
<?php
header("content-type:text/html;charset='utf-8'");
$post_url="http://localhost/session/action.php";
$post_data="user=hkui&pwd=123";
session_start(); 
$strCookie="PHPSESSID=".$_COOKIE['PHPSESSID']; 
session_write_close(); 
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$post_url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_COOKIE, $strCookie);
curl_setopt($ch,CURLOPT_POSTFIELDS,$post_data);
$con=curl_exec($ch);
curl_close($ch);

echo $strCookie;
echo "<hr/>";


$url="http://localhost/session/main.php";
$ch=curl_init(); 


session_write_close(); 
curl_setopt($ch, CURLOPT_COOKIE, $strCookie);
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
$con=curl_exec($ch);
curl_close($ch);

echo $con;
$
//print_r($_SESSION);
/*
echo <<<EEE
<script type="text/javascript">
window.location.
</script>
EEE;
*/
?>

模拟登陆也能成功,但是第一次进入时出现好多问题,刷新后就一切ok了

但刷新下就好了

如果session_write_close(); 写在后面 浏览器会死掉

还有CURLOPT_COOKIE到底怎么传东西的啊

展开
收起
爱吃鱼的程序员 2020-06-22 17:04:51 595 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    逻辑有点小问题,之所以第二次刷新后一切OK,是因为第二次你提交了session_id的cookie给服务端,第一次你没获取到session_id的cookie, 请看第六行: $strCookie="PHPSESSID=".$_COOKIE['PHPSESSID'];

    补充下,模拟登录一般流程是这样的:

    提交帐号信息-》服务器端验证---》返回cookie--->携带cookie访问--》服务器认为你已经登录了

    回复 @西门飞:是基于cookie的,我以为他俩的不一样,原来是一样的方式,让你见笑了,我想的太复杂了,谢谢您热心回复我!回复 @hphper:session是基于cookie没有cookie哪来的session回复 @西门飞:我这是session啊,cookie的那个我明白的回复 @hphper:如果你实在不想用原声的curl去实现,你可以考虑下snoopy这个库回复 @hphper:详细代码怎么写,你应该自己去看手册,你可以这样:1、提交帐号信息给服务器端,然后怎么获取服务器端返回的cookie?手册里面应该可以找到的你用的curl去看看,2、获取到服务器端返回的cookie以后想想怎么把这个cookie放到http请求中去?如果你这两个都实现了,这个问题就解决了,千万不要纠结语句怎么写,这是机械性的代码,手册也好百度也好你能找到答案的
    2020-06-22 17:05:08
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载