当前位置: 首页 > 面试题库 >

如何设置会话的生存期

养翔
2023-03-14
问题内容

如何在PHP中设置会话生存期?我希望将其设置为永久,只要该请求存在。该请求是AJAX。我处理AJAX请求的PHP代码是:

// AJAX.php
<?php    
session_start();

$_SESSION['counter'] = $_SESSION['counter'] + 1;

header('Content-type: application/json');    
echo json_encode(array('tick' => $_SESSION['counter']));
?>

和JavaScript:

$(document).ready(function() {            
function check() {
    getJSON('ajax.php');        
}

function getJSON(url) {                                
    return $.getJSON(
                url,
                function(data) {
                    $("#ticker").html(data.tick);
                }
           );
}

setInterval(function() {
    check();
}, 10000); // Tick every 10 seconds

});

该会话始终在300秒后重置。


问题答案:

PHP上的会话与Cookie类型的会话一起使用,而在服务器端,会话信息会不断删除。

要在php中设置时间,可以在session_start之前使用session_set_cookie_params 函数:

session_set_cookie_params(3600,"/");
session_start();

例如,3600秒是1个小时,2个小时是3600 * 2 = 7200。

但是它是会话cookie,浏览器可以自行使它过期,如果您想保存长时间会话(例如记住登录),则需要将数据保存在服务器中,并将标准cookie保存在客户端中。

您可以有一个表“会话”:

  • session_id int
  • session_hash varchar(20)
  • session_data文字

并验证Cookie,将“会话ID”和“哈希”(出于安全性考虑)保存在客户端,然后可以将会话的数据保存在服务器端,例如:

登录时:

setcookie('sessid', $sessionid, 604800);      // One week or seven days
setcookie('sesshash', $sessionhash, 604800);  // One week or seven days
// And save the session data:
saveSessionData($sessionid, $sessionhash, serialize($_SESSION)); // saveSessionData is your function

如果用户返回:

if (isset($_COOKIE['sessid'])) {
    if (valide_session($_COOKIE['sessid'], $_COOKIE['sesshash'])) {
        $_SESSION = unserialize(get_session_data($_COOKIE['sessid']));
    } else {
        // Dont validate the hash, possible session falsification
    }
}

显然,在发送数据之前,请保存所有会话/ cookie调用。



 类似资料:
  • 我需要使用session来保留用户的选择。(如果用户选择的日期范围在数据刷新时返回到默认值)。 这是我的daterangepicker代码。请帮助我如何设置“开始”日期和“结束”日期的会话存储,以及如何从会话存储中检索它们。提前道谢。

  • 我按照教程步骤尝试SBT: 有什么想法可以解决这个问题吗?

  • 我需要为我的应用程序设置一个mysql会话变量,以便按照预期使用MariaDB Galera集群。SQL调用是:。当应用程序使用数据库时,应始终设置该值。我使用EclipseLink作为JPA提供程序。 我的问题是:实现这一点的最佳途径是什么? 这对我不起作用。从EntityManager查询会话变量将返回值。 选项2:EntityManager工厂 每次创建新的EntityManager时,都会

  • 我需要向API服务发送一个post请求,该服务需要一个会话id以及post请求字段中的其他参数,以便获得所需的信息。 我正在使用邮递员来测试这个API。 我想知道在使用Postman时,如何在帖子请求中发送“会话ID”? 我知道Postman中的预请求脚本,但我不知道如何在post请求中使用该变量。

  • 我有一个运行在Tomcat5上的非常好用的web Java1.5web应用程序。应用程序依赖于它的会话,所以只要会话Cookie被传递出去,或者JSESSIONID出现在上下文路径的末尾,就可以正常工作,就像“;JSESSIONID=...” null

  • 我想设置会话点击链接,所以登录后,用户将重定向到上次访问的页面。 例如: 步骤1:用户打开主页。(seesion url设置为主页 第二步:下一步在新选项卡中,用户将打开联系人页面(再次会话变量重置) 第三步:用户进入首页,点击登录链接。(因为没有重新加载页面,所以没有设置会话) 第四步:登录后,用户将重定向到联系人页面。 但这里我想要用户被重定向到用户点击链接登录的地方。 我试着用下面的代码,但