We are in the process of migrating this forum. A new space will be available soon. We are sorry for the inconvenience.

Wygaśnięcie sesji


deallas
06-07-2007, 21:13
Wiem że to nic nie będzie miało wspólnego z java ani apachem ale można użyć także php. Wystarczy użyć sesji niestandardowych. Może to nie jest krótkie ale działa.
Kod PHP:
/***************************************************************************
 *                session.php
 *                -------------------
 *   author       : (C) 2007 Deallas
 *   begin        : 2007/06/22 15:01
 *   version      : 1.0
 *   powered      : phpFx
 *
 ***************************************************************************/

class dbSession
{
var 
$maxlifetime;
    function 
dbSession($gc_maxlifetime$gc_probability ""$gc_divisor "")
    {

            @
ini_set('session.gc_maxlifetime'$gc_maxlifetime);
            
$this->maxlifetime $gc_maxlifetime;
        if (
$gc_probability != "" && is_integer($gc_probability)) {
            @
ini_set('session.gc_probability'$gc_probability);

        }
        if (
$gc_divisor != "" && is_integer($gc_divisor)) {
            @
ini_set('session.gc_divisor'$gc_divisor);

        }
        
$this->sessionLifetime ini_get("session.gc_maxlifetime");

        
session_set_save_handler(
            array(&
$this'open'),
            array(&
$this'close'),
            array(&
$this'read'),
            array(&
$this'write'),
            array(&
$this'destroy'),
            array(&
$this'gc')
        );
        
register_shutdown_function('session_write_close');
        
session_start();

    }

    function 
stop()
    {
        
$this->regenerate_id();
        
session_unset();
        
session_destroy();
    }
    function 
regenerate_id()
    {


        
$oldSessionID session_id();
        
session_regenerate_id();
        
$this->destroy($oldSessionID);

    }

    function 
open($save_path$session_name)
    {

        return 
true;

    }
    function 
close()
    {
        return 
true;
    }
    function 
read($session_id)
    {
    global 
$db;
           
$sql "SELECT
                session_data
            FROM
               " 
SESSION_TABLE "
            WHERE
                session_id = '"
.$session_id."' AND
                http_user_agent = '"
.$_SERVER["HTTP_USER_AGENT"]."' AND
                session_expire > '"
.time()."'
        "
;
    
$result $db->query($sql) or error('Unable to fetch total user count'__FILE____LINE__$db->error());
        if (
is_resource($result) && $db->num_rows($result) > 0) {
            while (
$fields $db->fetch_assoc($result))
            {
            return 
$fields["session_data"];
            }
        }
        return 
"";

    }

    function 
write($session_id$session_data)
    {
     global 
$db$portal_config;
                
$sql "SELECT
                *
            FROM
                " 
SESSION_TABLE "
            WHERE
                session_id = '"
.$session_id."'
        "
;
        
$result $db->query($sql) or error('Unable to fetch total user count'__FILE____LINE__$db->error());
        if (
$db->num_rows($result) > 0) {
        
$sql "
                UPDATE
                    " 
SESSION_TABLE "
                SET
                    session_data = '"
.$session_data."',
                    session_expire = '"
.(time() + $this->sessionLifetime)."'
                WHERE
                    session_id = '"
.$session_id."'
            "
;
            
$result $db->query($sql) or error('Unable to fetch total user count'__FILE____LINE__$db->error());
            if (@
mysql_affected_rows()) {
                return 
true;

            }
        } else {
    

        
$sql "
                INSERT INTO
                    " 
SESSION_TABLE "
                        (
                            session_id,
                            http_user_agent,
                            session_data,
                            session_expire
                        )
                    VALUES
                        (
                            '"
.$session_id."',
                            '"
.$_SERVER["HTTP_USER_AGENT"]."',
                            '"
.$session_data."',
                            '"
.(time() + $this->sessionLifetime)."'
                        )
            "
;
            
$result $db->query($sql) or error('Unable to fetch total user count'__FILE____LINE__$db->error());

            if (@
mysql_affected_rows()) {

                return 
"";

            }

        }

        
// if something went wrong, return false
        
return false;

    }
    function 
destroy($session_id)
    {
    global 
$db;
            
$sql "
            DELETE FROM
                " 
SESSION_TABLE "
            WHERE
                session_id = '"
.$session_id."'
        "
;
        
$result $db->query($sql) or error('Unable to fetch total user count'__FILE____LINE__$db->error());

        if (
$db->affected_rows()) {
            return 
true;

        }
        return 
false;

    }

    function 
gc($maxlifetime)
    {
     global 
$db;
                 
$sql "
            DELETE FROM
                " 
SESSION_TABLE "
            WHERE
                session_expire < '"
.(time() - $maxlifetime)."'
        "
;
        
$result $db->query($sql) or error('Unable to fetch total user count'__FILE____LINE__$db->error());
        
// it deletes expired sessions from database

    
}

}
//zmienna session_lenght oznacza długość sesji
$sess = new dbSession($session_length);
?>
Oto mały fragment mojego systemu (jeszcze w wersji Alpha). Dobra objaśnie teraz funkcje...
function gc - odpowiada za wygaśnięcie sesji
open
close
read
write
destroy - po koleji otwarcie, zamknięcie,czytanie, edytowanie/ nowa sesja, niszczenie sesji
I oczywiście niezbędna klasa do obsługi połączenia z bazą MySQL
Kod PHP:
define('SESSION_TABLE''session_data');
class 
DBAction
{
var 
$prefix;
var 
$link_id;
var 
$query_result;
var 
$num_queries 0;
function 
__construct($db_host$db_username$db_password$db_name$db_prefix$p_connect null) {
        
$this->prefix $db_prefix;

        if (
$p_connect)
            
$this->link_id = @mysql_pconnect($db_host$db_username$db_password);
        else
            
$this->link_id = @mysql_connect($db_host$db_username$db_password);

        if (
$this->link_id)
        {
            if (@
mysql_select_db($db_name$this->link_id))
                return 
$this->link_id;
            else
                
error('Unable to select database. MySQL reported: '.mysql_error(), __FILE____LINE__);
        }
        else
            
error('Unable to connect to MySQL server. MySQL reported: '.mysql_error(), __FILE____LINE__);
                        }

         function 
start()
    {
        return;
    }
    function 
close()
    {
        if (
$this->link_id)
        {
            if (
$this->query_result)
                @
mysql_free_result($this->query_result);

            return @
mysql_close($this->link_id);
        }
        else
            return 
false;
    }
function 
query($sql)
    {

        
$this->query_result = @mysql_query($sql$this->link_id);

        if (
$this->query_result)
        {
        
            ++
$this->num_queries;
            return 
$this->query_result;
        }
        else
        {

            return 
false;
            
        }
        
    }
 function 
result($query_id 0$row 0)
    {
        if (
$query_id)
        {
            if (
$row)
                @
mysql_data_seek($query_id$row);

            
$cur_row = @mysql_fetch_row($query_id);
            return 
$cur_row[0];
        }
        else
            return 
false;
    }


function 
fetch_assoc($query_id 0)
    {
        return (
$query_id) ? @mysql_fetch_assoc($query_id) : false;
    }
function 
fetch_array($query_id 0)
    {
        return (
$query_id) ? @mysql_fetch_array($query_id) : false;
    }

function 
fetch_row($query_id 0)
    {
        return (
$query_id) ? @mysql_fetch_row($query_id) : false;
    }


function 
num_rows($query_id 0)
    {
        return (
$query_id) ? @mysql_num_rows($query_id) : false;
    }


function 
affected_rows()
    {
        return (
$this->link_id) ? @mysql_affected_rows($this->link_id) : false;
    }


 function 
insert_id()
    {
        return (
$this->link_id) ? @mysql_insert_id($this->link_id) : false;
    }


function 
get_num_queries()
    {
        return 
$this->num_queries;
    }
 function 
free_result($query_id false)
    {
        return (
$query_id) ? @mysql_free_result($query_id) : false;
    }


 function 
escape($str)
    {
        return 
mysql_real_escape_string($str);
    }


 function 
error()
    {
        
$result['error_no'] = @mysql_errno($this->link_id);
        
$result['error_msg'] = @mysql_error($this->link_id);

        return 
$result;
    }
}
// żeby połączenie z bazą działało trzeba wstawić daną klasę wraz z tym...
$db = new DBAction($host$user$passwd$name$prefix);
$db->start();
//...przed klasą obsługującą sesje 
Jeszcze tylko tabela w bd:
Kod:
CREATE TABLE `session_data` (
  `session_id` varchar(32) NOT NULL default '',
  `http_user_agent` varchar(255) NOT NULL default '',
  `session_data` longtext NOT NULL,
  `session_expire` int(11) NOT NULL default '0'
  PRIMARY KEY  (`session_id`)
)
Mam nadzieje że nie jest tego za dużo

dupa
05-07-2007, 18:33
Witam, na wstępie przepraszm że zamiast sie zarejestrować musiałem zalogować się na tego niezbyt ładnie nazywającego się użytkowinka, ale jestem w pracy i nie chce do rejestracji używać służbowego maila a zależy mi na czasie.

Piszę servlet javy (Apache, Tomcat). Jak mogę przechwycić informację w momencie, gdy sesja użytkownika wygaśnie? Chodzi mi o to, że gdy wygaśnie sesja danego użytkownika chcę wykonwać jakąś akcję.

Z góry dziękuję za wszelką pomoc!

Pozdrawiam,
CD