高分问个关于模拟登陆的问题

cuiyang000 2011-01-26 10:44:07
问题可能有点白痴,请教各位高手:

我现在有两个项目,都是用CI做的,一个在 abc.com, 一个在 xyz.com, 现在我要做的就是登陆了abc.com后,自动登陆xyz.com.

我的做法是登陆abc.com的时候,比如说在login.php里,增加通过CURL来登陆xyz.com的代码,在这里都是对的,登陆xyz.com也成功了,返回的信息都是对的.

可是这个时候如果我直接在浏览器里输入xyz.com,仍然被识别为未登录.

请问是不是通过curl登录的话,在xyz.com那里的login.php中生成session/cookie就无效了??

可是我在 假设 xyz.com/login.php里写的代码流程为

1) 用户名/密码检测
2) 把所有信息存入cookie(也就是CI的session,我并没有选择将session存入数据库)
3) var_dump($this->session->userdata)

而我在 abc.com/login.php中, CURL登陆xyz.com/login.php的返回值,也就是那个var_dump($this->session->userdata),一切都是对的,可是如果我把第三步换成var_dump($_COOKIE),就为array{}了.

请问这是为什么呢?是我的代码有误还是说CURL模拟登陆原本就无法做到真正的登陆(生成cookie并保存) ?
...全文
181 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
caoxiubo 2011-05-31
  • 打赏
  • 举报
回复
怎么用隐藏的IFRAME的传递的
q344617263 2011-01-27
  • 打赏
  • 举报
回复
不妨在两个站点之间做一个接口,依赖session_id的传递以达到同步登陆
楼主可以参考ucenter的同步登陆解决方案
君望永远 2011-01-27
  • 打赏
  • 举报
回复
cookie不行的 LZ还是写到DB里吧
lizhe11 2011-01-27
  • 打赏
  • 举报
回复
做个单点登录吧,想简单的话,就把session保存到数据库中,访问A应用的时候,把sessionID传递过去,不过A应用在启动session前,应设置sessionID,session_id(),可实现跨域共享session.
cuiyang000 2011-01-27
  • 打赏
  • 举报
回复
问题已经解决了,用了个隐藏的iframe来传递session_id
ihefe 2011-01-27
  • 打赏
  • 举报
回复
把session_id存入数据库, 2个网站共用
skyaspnet 2011-01-27
  • 打赏
  • 举报
回复
还是需要使用CURL

PHP的cURL库功能简介:抓取网页,POST数据及其他


本文介绍了PHP的cURL库的几个使用方法。cURL是一个功能强大的PHP库,可以用于获取网页内容,获取网页内容以及取一个XML文件并把其导入数据库等等。
使用PHP的cURL库可以简单和有效地去抓网页。你只需要运行一个脚本,然后分析一下你所抓取的网页,然后就可以以程序的方式得到你想要的数据了。无论是你想从从一个链接上取部分数据,或是取一个XML文件并把其导入数据库,那怕就是简单的获取网页内容,cURL 是一个功能强大的PHP库。本文主要讲述如果使用这个PHP库。

启用 cURL 设置

首先,我们得先要确定我们的PHP是否开启了这个库,你可以通过使用php_info()函数来得到这一信息。

﹤?phpphpinfo();?﹥




如果你可以在网页上看到下面的输出,那么表示cURL库已被开启。

如果你看到的话,那么你需要设置你的PHP并开启这个库。如果你是在Windows平台下,那么非常简单,你需要改一改你的php.ini文件的设置,找到php_curl.dll,并取消前面的分号注释就行了。如下所示:

//取消下在的注释extension=php_curl.dll



如果你是在Linux下面,那么,你需要重新编译你的PHP了,编辑时,你需要打开编译参数——在configure命令上加上“–with-curl” 参数。

一个小示例

如果一切就绪,下面是一个小例程:

﹤?php
// 初始化一个 cURL 对象
$curl = curl_init();

// 设置你需要抓取的URL
curl_setopt($curl, CURLOPT_URL, 'http://cocre.com');

// 设置header
curl_setopt($curl, CURLOPT_HEADER, 1);

// 设置cURL 参数,要求结果保存到字符串中还是输出到屏幕上。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

// 运行cURL,请求网页
$data = curl_exec($curl);

// 关闭URL请求
curl_close($curl);

// 显示获得的数据
var_dump($data);


如何POST数据

上面是抓取网页的代码,下面则是向某个网页POST数据。假设我们有一个处理表单的网址http://www.example.com/sendSMS.php,其可以接受两个表单域,一个是电话号码,一个是短信内容。

﹤?php$phoneNumber = '13912345678';$message = 'This message was generated by curl and php';$curlPost = 'pNUMBER=' . urlencode($phoneNumber) . '&MESSAGE=' . urlencode($message) . '&SUBMIT=Send';$ch = curl_init();curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/sendSMS.php');curl_setopt($ch, CURLOPT_HEADER, 1);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);$data = curl_exec();curl_close($ch);?﹥



从上面的程序我们可以看到,使用CURLOPT_POST设置HTTP协议的POST方法,而不是GET方法,然后以CURLOPT_POSTFIELDS设置POST的数据。

关于代理服务器

下面是一个如何使用代理服务器的示例。请注意其中高亮的代码,代码很简单,我就不用多说了。

﹤?php $ch = curl_init();curl_setopt($ch, CURLOPT_URL, 'http://www.example.com');curl_setopt($ch, CURLOPT_HEADER, 1);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);curl_setopt($ch, CURLOPT_PROXY, 'fakeproxy.com:1080');curl_setopt($ch, CURLOPT_PROXYUSERPWD, 'user:password');$data = curl_exec();curl_close($ch);?﹥


关于SSL和Cookie

关于SSL也就是HTTPS协议,你只需要把CURLOPT_URL连接中的http://变成https://就可以了。当然,还有一个参数叫CURLOPT_SSL_VERIFYHOST可以设置为验证站点。

关于Cookie,你需要了解下面三个参数:

CURLOPT_COOKIE,在当面的会话中设置一个cookie

CURLOPT_COOKIEJAR,当会话结束的时候保存一个Cookie

CURLOPT_COOKIEFILE,Cookie的文件。

HTTP服务器认证

最后,我们来看一看HTTP服务器认证的情况。

﹤?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.example.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt(CURLOPT_USERPWD, '[username]:[password]')

$data = curl_exec();
curl_close($ch);
?﹥


关于其它更多的内容,请参看相关的cURL手册。

cuiyang000 2011-01-27
  • 打赏
  • 举报
回复
先谢谢楼上各位大大..

不过如果要传sessionID 过去,我该如何传呢?从abc.com并无直接链接到xyz.com,用户唯一所做的操作就是登陆abc.com而已.

#2楼所说的接口,是指API接口吗?那样的话岂不是还是要用CURL ? 能说详细点吗?

#3楼所说的传递,请问是通过何种方式呢?

再次感谢
ghostxyz0 2011-01-26
  • 打赏
  • 举报
回复
curl 无法进行模拟登录的
因为客户端访问有是的 abc.com/login.php 并没有对 xyz.com/login.php进行访问
对xyz.com/login.php访问的(由你的server application进行的),实际上是服务器端的
所以xyx.com的COOKIE并没有留在客户端中

自然也就没有什么SESSION 之类的

以上属个人见解.

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧