Как избежать тайм-аута сеанса в ситуации без входа в систему php?

Я установил 2 минуты для тайм-аута сеанса, и если это произойдет, страница будет перенаправлена ​​​​на страницу тайм-аута сеанса.

Однако у меня есть некоторые страницы, которые можно просматривать без входа в систему. На этих страницах, если я оставлю это более чем на 2 минуты, появится всплывающее окно с просьбой снова войти в систему. Пользователь вернется, чтобы щелкнуть по нему, и он будет перенаправлен на страницу тайм-аута сеанса.

Может ли кто-нибудь научить меня, как избавиться от этого, чтобы страницы, просматриваемые без входа в систему, не происходили во время сеанса?

ajax.js

window.onload = init;
var interval;
function init() {
    interval = setInterval(trackLogin, 1000);
}
function trackLogin() {
    var xmlReq = false;
    try {
        xmlReq = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
        try {
            xmlReq = new ActiveXObject("Microsoft.XMLHTTP");
        } catch (e2) {
            xmlReq = false;
        }
    }
    if (!xmlReq && typeof XMLHttpRequest != 'undefined') {
        xmlReq = new XMLHttpRequest();
    }

    xmlReq.open('get', 'check.php', true);
    xmlReq.setRequestHeader("Connection", "close");
    xmlReq.send(null);
    xmlReq.onreadystatechange = function() {
        if (xmlReq.readyState == 4 && xmlReq.status == 200) {
            if (xmlReq.responseText == 1) {
                clearInterval(interval);
                alert('You have been logged out. You will now be redirected to home page.');
                document.location.href = "index.php";
            }
        }
    }
}

первая сессия

<?php
// session_start ();
if (! isset ( $_SESSION ["isLoggedIn"] ) || ! ($_SESSION ['isLoggedIn'])) {
    // code for authentication comes here
    // ASSUME USER IS VALID
    $_SESSION ['isLoggedIn'] = true;

    $_SESSION ['timeOut'] = 120;
    $logged = time ();
    $_SESSION ['loggedAt'] = $logged;
    // showLoggedIn ();
} else {
    require 'timeCheck.php';
    $hasSessionExpired = checkIfTimedOut ();
    if ($hasSessionExpired) {
        session_unset ();
        header ( "Location:index.php" );
        exit ();
    } else {
        $_SESSION ['loggedAt'] = time (); 
    }
}
?>

footer.php

<?php include ('includes/firstSession.php'); ?>
<footer class="main">
<div class="wrapper container">
    <div class="copyright">All Rights Reserved
    </div>

    <div class="logo"><img src="images/logo.png"></div>

</footer>
</div>

черновик ajax.js

window.onload = init;
var interval;
function init() {
    interval = setInterval(trackLogin, 1000);
}
function trackLogin() {
    var xmlReq = false;
    try {
        xmlReq = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
        try {
            xmlReq = new ActiveXObject("Microsoft.XMLHTTP");
        } catch (e2) {
            xmlReq = false;
        }
    }
    if (!xmlReq && typeof XMLHttpRequest != 'undefined') {
        xmlReq = new XMLHttpRequest();
    }

    xmlReq.open('get', 'check.php', true);
    xmlReq.setRequestHeader("Connection", "close");
    xmlReq.send(null);
    xmlReq.onreadystatechange = function() {
        if (xmlReq.readyState == 4 && xmlReq.status == 200) {
            return json_encode(array(
                    'role' => $_SESSION['role'], //assuming something like guest/logged-in
                    'user_id'   => $_SESSION['user_id']
                ));
            var obj = xmlReq.responseText;
            var jsonObj = JSON.parse(obj);
            //now we can make a comparison against our keys 'role' and 'user_id'

            if(jsonObj['role'] == 'guest'){
                //guest role, do something here
            } else if (jsonObj['role'] == 'logged-in') {
                alert('You have been logged out. You will now be redirected to home page.');
                document.location.href = "index.php";
                //do something else for logged in users
            }

person SitiNuraini Yakob    schedule 02.11.2015    source источник
comment
вы можете просто уничтожить сессию...   -  person Happy Coding    schedule 02.11.2015
comment
Я не могу, потому что у меня есть эти страницы, к которым могут получить доступ как пользователь, так и пользователь, не вошедший в систему. как мне поступить? @raveenanigam   -  person SitiNuraini Yakob    schedule 02.11.2015


Ответы (1)


Я думаю, что, поскольку у вас есть сеанс, который является постоянным независимо от того, вошли ли вы в систему или нет, вам нужно основывать свои действия на имени пользователя (однако оно установлено). Посмотрите, не это ли вы пытаетесь сделать. Я отметил для ясности:

myfunctions.php

<?php
// return a session set on not set OR false if set
function is_loggedin()
    {
        return (!empty($_SESSION["isLoggedIn"]));
    }
// Check if username is set (not sure how your usernames are stored in your session
// but that is what you want to check here
function user_set()
    {
        return (!empty($_SESSION["username"]));
    }
// Do your set time function
function set_time_out($timeout = 120)
    {
        $_SESSION['isLoggedIn'] =   true;
        $_SESSION['timeOut']    =   (is_numeric($timeout))? $timeout : 120;
        $_SESSION['loggedAt']   =   time();
    }

function process_timeout($supRed = false)
    {
        // If a user has NOT already been poking around your site
        if(!is_loggedin()) {
                // Set the timeout
                set_time_out();
                return 0;
            }
        else {
                // If a navigating user is logged in
                if(user_set())  {
                        // Check for expire time
                        require('timeCheck.php');
                        // If they have been timed out
                        if(checkIfTimedOut()) {
                                if(!$supRed) {
                                        // destroy the session and forward to login (or wherever)
                                        session_destroy();
                                        header("Location:index.php" );
                                        exit();
                                    }

                                return 1;
                            }
                    }
                // Set the logged time by default
                $_SESSION['loggedAt']   =   time(); 
            }

        return 0;
    }

header.php

<?php
include_once("includes/firstSession.php");
include_once("includes/myfunctions.php");
process_timeout();
?><!DOCTYPE html>
...etc

check.php

<?php
include_once("includes/firstSession.php");
include_once("includes/myfunctions.php");
echo process_timeout(true);

ИЗМЕНИТЬ:

Это весь скрипт, как js, так и php.

// return a session set on not set OR false if set
function is_loggedin()
    {
        return (!empty($_SESSION["isLoggedIn"]));
    }
// Check if username is set (not sure how your usernames are stored in your session
// but that is what you want to check here
function user_set()
    {
        return (!empty($_SESSION["username"]));
    }
// Do your set time function
function set_time_out($timeout = 120)
    {
        $_SESSION['isLoggedIn'] =   true;
        $_SESSION['timeOut']    =   (is_numeric($timeout))? $timeout : 120;
        $_SESSION['loggedAt']   =   time();
    }

function checkIfTimedOut()
    {
        if(!empty($_SESSION['loggedAt'])) {
                $active =   ($_SESSION['loggedAt'] + strtotime("120 seconds"));
                $now    =   time();
                return (($active - $now) > 0);
            }

        return true;
    }

function process_timeout($supRed = false)
    {
        // If a user has NOT already been poking around your site
        if(!is_loggedin()) {
                // Set the timeout
                set_time_out();
                return 0;
            }
        else {
                // If a navigating user is logged in
                if(user_set())  {
                        // Check for expire time
                        // If they have been timed out
                        if(checkIfTimedOut()) {
                                // destroy the session
                                session_destroy();
                                if(!$supRed) {
                                         // Forward to login (or wherever)
                                        header("Location:index.php" );
                                        exit();
                                    }
                                return 1;
                            }
                    }
                // Set the logged time by default
                $_SESSION['loggedAt']   =   time(); 
            }

        return 0;
    }

check.php:

// Include the functions here
if(!empty($_POST['getPost'])) {
    echo json_encode(array("redirect"=>process_timeout(true),"sess"=>$_SESSION));
    exit;   
}

ЗВОНЯЩАЯ СТРАНИЦА:

<script type="text/javascript" src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script type="text/javascript" src="http://code.jquery.com/ui/1.9.2/jquery-ui.js"></script>
<script>
function init()
    {
        interval = setInterval(trackLogin, 2000);
    }

function trackLogin()
    {
        $.ajax({
                url: '/check.php',
                data: { getPost: true },
                type: 'post',
                success: function(response) {
                        var instr   =   JSON.parse(response);
                        console.log(response);

                        if(instr.redirect == 1) {
                                clearInterval(interval);
                                alert('You have been logged out. You will now be redirected to home page.');
                                document.location.href = "index.php";
                            }
                    }
        });
    }

$(document).ready(function() {
    var interval;
    init();
});
</script>

ОТРЕДАКТИРОВАНО

введите здесь описание изображения

person Rasclatt    schedule 02.11.2015
comment
Спасибо! но что, если я добавил тайм-аут сеанса ajax в нижний колонтитул и добавил ко всем страницам, к которым могут получить доступ некоторые страницы, как пользователи (не вошедшие в систему, так и вошедшие в систему); пользователь, не вошедший в систему, хочет получить доступ к странице и увидеть всплывающее окно, которое предлагает пользователю перенаправить вход, даже если пользователь не вошел в свою учетную запись? как я должен различать тайм-аут сеанса на странице? - person SitiNuraini Yakob; 02.11.2015
comment
Это то же самое. Ваш ajax должен получить ответ от средства проверки для перезагрузки или нет, поэтому check.php должна иметь ту же логику, но вместо перенаправления header() он должен отображать 0 для отсутствия перенаправления и 1 для перенаправления, чтобы ваш ajax знал, что делать. - person Rasclatt; 02.11.2015
comment
я не понимаю, как мне кодировать из того, что вы объяснили :-( @Rasclatt - person SitiNuraini Yakob; 02.11.2015
comment
Хорошо, держись. буду пересматривать. Стоит отметить, что эта логика сеанса должна выполняться до того, как страница отобразится в браузере, а не внизу страницы. - person Rasclatt; 02.11.2015
comment
посмотрите мою версию, возможно, это даст вам лучшее представление о том, что я рекомендую - person Rasclatt; 02.11.2015
comment
я несколько получил идею идея. Как вы думаете, я должен назвать это в footer.php? но если это в footer.php, это будет полностью внизу @Rasclatt - person SitiNuraini Yakob; 02.11.2015
comment
Вы не должны вызывать ничего из этого в нижнем колонтитуле (php). Вот почему я добавил его в header.php (при условии, что он у вас есть, конечно). - person Rasclatt; 02.11.2015
comment
Я пытался следовать вашему методу, однако, это не имеет никакого значения. Он по-прежнему будет вызывать всплывающее окно с просьбой перенаправить пользователя на домашнюю страницу, даже если пользователь еще не вошел в свою учетную запись. Я предполагаю, что это моя ошибка ajax.js. Что вы думаете? @Расклатт - person SitiNuraini Yakob; 04.11.2015
comment
Да, вам нужно исправить успех Ajax, чтобы учесть истинный или ложный возврат из php - person Rasclatt; 04.11.2015
comment
Как мне это сделать? У вас есть тому пример? @Расклатт - person SitiNuraini Yakob; 06.11.2015
comment
тут немного посмотрю - person Rasclatt; 06.11.2015
comment
Я обновил свой пост. Выше есть черновик ajax.js, который я пытаюсь закодировать, чтобы учесть истинный или ложный возврат из php. Как мне уйти отсюда, потому что это не работает @Rasclatt - person SitiNuraini Yakob; 06.11.2015
comment
Посмотрим, смогу ли я написать что-нибудь очень быстро. К сожалению, это будет в jQuery ajax, потому что я не знаю, как делать обычный javascript. - person Rasclatt; 06.11.2015
comment
хорошо конечно. ничего страшного. я посмотрю, как вы это реализуете позже @Rasclatt - person SitiNuraini Yakob; 06.11.2015
comment
Хорошо, я думаю, это было не быстро, но я сделал это. Мне пришлось повозиться, чтобы сделать это правильно. Смотрите мой РЕДАКТИРОВАТЬ - person Rasclatt; 06.11.2015
comment
Вы захотите удалить содержимое сеанса из возврата. Я просто поместил это туда, чтобы вы могли видеть возврат в консоли. - person Rasclatt; 06.11.2015
comment
попробовать. ваша вызывающая страница - это обычный файл php? или джаваскрипт? @Расклатт - person SitiNuraini Yakob; 06.11.2015
comment
Извините, это было на моей странице, вы можете поместить его в файл .js, если вы включите библиотеку jQuery в свой заголовок. - person Rasclatt; 06.11.2015
comment
к сожалению, нет, я не заработал. думал, есть ли другой способ @Rasclatt - person SitiNuraini Yakob; 09.11.2015
comment
Хм. Боюсь, не увидев его в действии на вашем сайте, я больше не смогу помочь. - person Rasclatt; 09.11.2015
comment
все хорошо. Я буду пытаться. Только в одном я совершенно не уверен. Вы упомянули выше, что «вам нужно основывать свои действия на имени пользователя (независимо от того, какое оно установлено)». Я не уверен в своем. когда пользователь входит в систему, он основан на адресе электронной почты и пароле. Означает ли это, что я основываюсь на адресе электронной почты? @Расклатт - person SitiNuraini Yakob; 09.11.2015
comment
Ну вроде. Вы используете адрес электронной почты в качестве имени пользователя, я использую что угодно, но я имею в виду сеансовый ключ, который вы используете для присвоения этого значения. Для меня это username как в $_SESSION['username'], и он не устанавливается, пока пользователь не войдет в систему. Вот как моя программа узнает, что пользователь аутентифицирован. Возможно, вы используете isLoggedIn, как в случае с -> $_SESSION["isLoggedIn"], который я бы не стал устанавливать, потому что вы не вошли в систему, если не задано имя пользователя. Вот где вы должны адаптировать мой сценарий к вашему сценарию сеанса. - person Rasclatt; 09.11.2015
comment
спасибо, это было намного более ясное объяснение! Однако я включил jQuery и include_once('includes/firstSession.php'); include_once('includes/myfunctions.php'); process_timeout(); в свой header.php, но в итоге получил пустой белый экран. - person SitiNuraini Yakob; 09.11.2015
comment
Если вы получите пустой белый экран, то в самом верху вашей страницы, еще до session_start(), напишите: error_reporting(E_ALL); ini_set("display_errors",1);, что покажет вам, что не так. Подскажите что там написано, может чем смогу помочь - person Rasclatt; 09.11.2015
comment
Давайте продолжим обсуждение в чате. - person SitiNuraini Yakob; 09.11.2015
comment
ссылка @Rasclatt - person SitiNuraini Yakob; 26.11.2015