curl模拟session登陆出现小问题

hphper 发布于 2013/09/01 20:19
阅读 7K+
收藏 0

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

在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;
$href=$_SERVER['PHP_SELF'];
//print_r($_SESSION);
/*
echo <<<EEE
<script type="text/javascript">
window.location.href='{$href}';
</script>
EEE;
*/
?>

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

但刷新下就好了

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

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

加载中
0
西门飞
西门飞

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

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

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

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