功能背景: 该功能为用户进行某操作,跳转到验证页面。验证成功后,自动跳回用户操作页面。如网络搜索查看某篇文章,用户发表评论前需要先登录。
实现方案:
1.建立通用了Controller,创建_initialize方法进行登陆验证并自动跳转到登陆验证页面。
2.Admin\Login Controller进行验证。验证成功后,跳回发起验证页面。
问题难点:
1.redirect方法需要将发起验证的页面地址传递给登录页面,为验证后跳回登陆验证发起页面。
2.在登陆验证后,跳转前。如何在Controller中获取发起登陆验证页面的链接地址。
关键实现代码:
1.通用Controller
function _initialize()
{
//设置编码格式
header('Content-type:text/html;charset=UTF-8');
if(!isset($_COOKIE['auto']))
{
//$backUrl='';
$backUrl=$this->get_url();
$backUrl=urlencode($backUrl);
//echo $backUrl;
//die();
$this->redirect('Admin/Login/Login',array('backUrl'=>$backUrl),5,'正在跳转.....');
}
else{
echo "Cookie 已经设置";
echo $_COOKIE['auto'];
cookie('auto',null);
}
}
/**
* 获取当前页面完整URL地址
*/
public function get_url() {
$sys_protocal = isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == '443' ? 'https://' : 'http://';
$php_self = $_SERVER['PHP_SELF'] ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME'];
$path_info = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '';
//$relate_url = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : $php_self.(isset($_SERVER['QUERY_STRING']) ? '?'.$_SERVER['QUERY_STRING'] : $path_info);
$relate_url = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : $php_self.(isset($_SERVER['QUERY_STRING']) ? '?'.$_SERVER['QUERY_STRING'] : $path_info);
//return $sys_protocal.(isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '').$relate_url;
return $relate_url;
} 2.Admin Login 代码: public function Login($backUrl="")
{
header('Content-type:text/html;charset=UTF-8');
# code...
//$backUrl=$_GET['backUrl'];
//echo 'backUrl'.$backUrl;
//echo "上次访问地址:".$_SERVER['HTTP_REFERER'] ;
$backUrl=urldecode($_GET['backUrl']);
echo $backUrl;
//die();
//$this->display();
$ip=get_client_ip();
cookie('auto','willa'.'|'.'accp'.'|'.$ip); //这里只为测试 是否 通过验证跳转到验证发起页,做的伪装cookie
redirect(urldecode($_GET['backUrl']),5,'正在跳转.....');
//echo "this login ";
} 以上通过 get_url() 获取了当前发起验证的页面链接地址。并通过urlencode函数将连接地址封装了一下。传递给admin login ,待验证结果进行回跳的操作。待解决问题:
在以上两段代码中,大家会发现使用了两种形式的redirect(暂且这么称呼,我也没有十足的把我说明两者的不同。最起码的参数列表是不同的)。
第一种通过$this->redirect 调用的是TP中自带的redirect方法。可以在手册查到其相关说明。这里不多说。
第二种直接写redirect 我就不清楚是调用的哪个了。好像php内部没有redierct方法。但是直接写redirect和$this->redirect的参数还不太一样。还请哪位仁兄赐教。
最佳答案