(Spotify) как остановить совместное использование сеансов в разных браузерах?

#php #session #cross-browser #spotify #fat-free-framework

#php #сессия #кросс-браузерный #spotify #fat-free-framework

Вопрос:

Я использую spotify api и по какой-то причине их блоки класса сеанса для хранения собственных данных в $ _SESSION. В качестве обходного пути я написал класс SystemHelper:

приложение пространства имен;

     class SystemHelper
    {

        /**
         * if session_id is empty string, then session_id has not been initialized
         * then set session_id named 'session1'
         * start session needs 2 parameters, name and value
         * always close session after writing
         *
         * @param   string  $name   any given name
         * @param   [type]  $value  any given value
         *
         */
        public static function customSessionStore($name, $value)
        {
    
            if (session_id() == '') {
                session_id('session1');
            }
            session_start();
            $_SESSION[$name] = $value;
            session_write_close();
        }
  

Теперь можно хранить данные в $ _SESSION, но проблема в том, что пока я вхожу в свою учетную запись (собственная форма входа, а не учетная запись spotfiy), все остальные входят в систему, независимо от того, какой браузер, IP и т.д…

Я не знаю, как это можно решить. Разве session_id не должен генерировать случайный идентификатор? Кто-нибудь может помочь, пожалуйста?

Оставляя

             if (session_id() == '') {
                session_id('session1');
            }
  

это не решает проблему, потому что мне также нужно прочитать и удалить данные, хранящиеся в сеансе. Итак, дополнительно у меня есть этот обходной путь:

     public static function customSessionRead($name)
        {

            if (session_id() == '') {
                session_id('session1');
            }
            session_start();
            session_write_close();

            return $_SESSION[$name];
        }
  

и…

     public static function customSessionDestroy()
        {
            session_start();
            session_destroy();
        }
  

Ответ №1:

Если я правильно понял.. все ваши пользователи получают одинаковый session_id().

Таким образом, они технически разделяют один сеанс. Насколько я знаю, если вы начнете сеанс, session_id() будет сгенерирован автоматически. Таким образом, вам не нужно устанавливать session_id() самостоятельно.

Итак, ваш код должен выглядеть следующим образом:

 class SystemHelper
{

    /**
     * if session_id is empty string, then session_id has not been initialized
     * then set session_id named 'session1'
     * start session needs 2 parameters, name and value
     * always close session after writing
     *
     * @param   string  $name   any given name
     * @param   [type]  $value  any given value
     *
     */
    public static function customSessionStore($name, $value)
    {
        session_start();
        $_SESSION[$name] = $value;
        session_write_close();
    }
}
  

Комментарии:

1. спасибо за ваш быстрый ответ, я отредактировал свой вопрос, добавил sessionRead и sessionDestroy; Я не могу пропустить то, что вы предлагаете

Ответ №2:

Решаемая, на самом деле довольно простая. Проблема первая: если написано так:

     session_id('session1');
  

как в customStore, так и в customRead просто означает возобновление сеанса. Конечно, вы всегда будете получать одни и те же данные, независимо от того, какой браузер, ip, … в этом смысл возобновления сеанса.

Что решается:

     session_create_id($name);
  

Итак, снова полный:

 public static function customSessionStore($name, $value)
{
    // if (session_id() == '') {
    //     session_id('session1');
    // }
    session_create_id($name);
    session_start();
    $_SESSION[$name] = $value;
    session_write_close();
}
  

и,

 public static function customSessionRead($name)
{
    // if (session_id() == '') {
    //     session_id('session1');
    // }
    session_start();
    session_write_close();
    return $_SESSION[$name];
}