想象一个使用场景:
你朋友给你推荐了一个网站链接,但这个链接并不是网站的首页(www.site.com),而是网站里面某个功能页面(www.site.com?key/value/key/value/key/value),并且这个网站是需要登陆使用的。那么当你点击这个链接请求服务器,服务器就会判断出你还未登陆就跳转到了登陆页面,很正常的一个功能。
那么等你登陆后,页面是跳到了首页(www.site.com),也很正常。但实质上你是想直接就进入到你朋友发给你的页面,所以不复杂点的话你可以点击几下进入到你朋友提供的页面(但这样影响体验,因为每次点击都需要请求资源的话,那就会浪费了一些时间),或者你可以再次复制链接(这样又得切换至朋友给的链接窗口,还得做重复操作)
那么最好的做法是什么呢?那就是登陆后能够直接进入到目标链接,省去无用的操作。那么要怎么实现这个小功能呢?也很简单的,可以看到需要我们处理的就两个问题,1.记住登陆前链接;2.登陆后重定向到目标链接而不是首页。
- 记住登陆前链接
因为PHP是无状态的,并不会记住上次的请求。所以我们需要把登陆数据保存下来(url),使用的是session技术。相信大家也想到了,我们经常使用它来判断登陆信息。 - 重定向
这个就是使用到header了。
举个栗子
我使用本地搭建的web服务进行操作,访问
www.method.com?method=member
php判断未登陆进入登陆页,并且记住了访问位置(method=member)
当我输入密码验证成功后,就会将地址重定向到上一次访问的链接地址
代码实例
<?php
class ReturnUrl
{
public function member(Login $login)
{
$guest = $login->isGuest;
if($guest) {
$url = $_SERVER['REQUEST_URI'];
$login->setSession('url', $url);
$host = $_SERVER['HTTP_HOST'];
header('Location:http://'. $host, true, 302);
} else {
echo "I'm a member";
}
}
public function login(Login $login)
{
if($login->isGuest)
$login->getPage();
else
echo "You have logined";
}
public function logout(Login $login)
{
$login->logout();
}
public function validate(Login $login)
{
$password = $_GET['password'] ?? '';
$result = $login->validate($password);
if ($result) {
$returnUrl = 'http://'. $_SERVER['HTTP_HOST']. $login->url;
header('Location:'. $returnUrl, true, 302);
}
}
}
$methods = ['login', 'member', 'validate', 'logout'];
$fn = isset($_GET['method']) ? (in_array($_GET['method'], $methods) ? $_GET['method'] : 'login') : 'login';
(new ReturnUrl())->$fn(new Login());
class Login
{
public $password = 'ruturnurl';
public function __construct()
{
@session_start();
}
public function validate($password)
{
if(strcmp($password, $this->password)) {
$this->login();
return true;
} else {
return false;
}
}
public function login()
{
$this->setSession('id', 'success');
}
public function logout()
{
unset($_SESSION['id']);
}
public function setSession($key, $value)
{
$_SESSION[$key] = $value;
}
public function __get($key)
{
$fn = 'get'. ucfirst($key);
return $this->$fn();
}
public function getIsGuest()
{
return isset($_SESSION['id']) ? false : true;
}
public function getUrl()
{
return isset($_SESSION['url']) ? $_SESSION['url'] : '';
}
public function getPage()
{
$form = '
<form action="" method="get">
输入密码:<input type="password" name="password">
<input type="submit" value="submit">
<input type="hidden" value="validate" name="method">
</form>
';
die($form);
}
}