PHP小功能 - 记住登陆前链接

想象一个使用场景:
你朋友给你推荐了一个网站链接,但这个链接并不是网站的首页(www.site.com),而是网站里面某个功能页面(www.site.com?key/value/key/value/key/value),并且这个网站是需要登陆使用的。那么当你点击这个链接请求服务器,服务器就会判断出你还未登陆就跳转到了登陆页面,很正常的一个功能。
那么等你登陆后,页面是跳到了首页(www.site.com),也很正常。但实质上你是想直接就进入到你朋友发给你的页面,所以不复杂点的话你可以点击几下进入到你朋友提供的页面(但这样影响体验,因为每次点击都需要请求资源的话,那就会浪费了一些时间),或者你可以再次复制链接(这样又得切换至朋友给的链接窗口,还得做重复操作)


那么最好的做法是什么呢?那就是登陆后能够直接进入到目标链接,省去无用的操作。那么要怎么实现这个小功能呢?也很简单的,可以看到需要我们处理的就两个问题,1.记住登陆前链接;2.登陆后重定向到目标链接而不是首页。

  1. 记住登陆前链接
    因为PHP是无状态的,并不会记住上次的请求。所以我们需要把登陆数据保存下来(url),使用的是session技术。相信大家也想到了,我们经常使用它来判断登陆信息。
  2. 重定向
    这个就是使用到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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值