发送Ajax请求时避免会话超时重置

如何解决发送Ajax请求时避免会话超时重置

如果通过ajax向特定控制器功能发出发布请求,是否可以告诉codeigniter跳过会话超时重置。我经常在用户登录信息中心内进行ajax调用来检查某些内容,但是这些调用使会话保持活动状态,因此即使用户保持非活动状态10分钟(sess_expiration时间)也不会被杀死,并且它们仍将永远保持登录状态。>

解决方法

如果(并且只有IF)您的Ajax调用是完全与会话无关的(即,无需登录即可运行,不需要用户的任何会话数据,等等),您可以进行服务从一个单独的特定于ajax的控制器发出Ajax请求,然后在使用该特定控制器时禁止会话库自动加载。

如果ajax调用需要已登录的用户,那么您通常不走运。

但是,如果满足这些条件,请在$autoload['libraries]中找到application/config/autoload.php部分,并使用此肮脏的技巧:

// Here,an array with the libraries you want/need to be loaded on every controller
$autoload['libraries'] = array('form_validation');

// Dirty hack to avoid loading the session library on controllers that don't use session data and don't require the user to have an active session
$CI =& get_instance();
// uncomment the one that fits you better
// Alternative 1: you only have a single controller that doesn't need the session library
// if ($CI->router->fetch_class() != 'dmz') array_push($autoload['libraries'],'session');
// END alternative 1

// Alternative 2: you have more than one controller that doesn't need the session library
// if (array_search($CI->router->fetch_class(),array('dmz','moredmz')) === false) array_push($autoload['libraries'],'session');
// END alternative 2

在上面的代码中,dmzmoredmz是我的两个虚构的控制器名称,它们要求不加载会话库。每当不使用它们时,session库将被推入自动加载并因此被加载。否则,session库将被忽略。

我实际上在我的一个站点上运行了此命令,以便允许运行我的负载均衡器的运行状况检查(在每台应用程序服务器上每5秒从主负载均衡器及其备份上运行一次)并填写我的会话表带有无用的数据,就像魅力一样。

不确定所使用的CI版本,但是上面的代码已在CI 3.1.11上进行了测试。

现在,当您声明Ajax调用需要会话驱动程序时,解决此问题的唯一方法是使会话驱动程序本身有些混乱。在3.1.11中,会话驱动程序位于system/libraries/Session/Session.php中,您需要更改的部分是构造方法的最后一部分(从第160行开始看)。对于此示例,我假设您的Ajax调用是由名为“ Ajax”的特定控制器处理的

// This is from line 160 onwards
elseif (isset($_COOKIE[$this->_config['cookie_name']]) && $_COOKIE[$this->_config['cookie_name']] === session_id())
        {
            $CI =& get_instance();
            $new_validity = ($CI->router->fetch_class() !== 'ajax') ? time() + $this->_config['cookie_lifetime'] : $_SESSION['__ci_last_regenerate'] + $this->_config['cookie_lifetime'];

            setcookie(
                $this->_config['cookie_name'],session_id(),(empty($this->_config['cookie_lifetime']) ? 0 : $new_validity),$this->_config['cookie_path'],$this->_config['cookie_domain'],$this->_config['cookie_secure'],TRUE
            );
        }

        $this->_ci_init_vars();

        log_message('info',"Session: Class initialized using '".$this->_driver."' driver.");
简而言之,此示例(尚未对其进行测试,因此请在部署之前进行此操作,它可能有错字或两个错字)将首先实例化CI核心,并从路由器获取控制器名称。如果它是常规控制器,它将确定新的cookie有效性为“现在加上配置中的cookie有效性”。如果是ajax控制器,则cookie的有效性将与当前的有效性相同(最后的再生时间加上cookie的有效性..必须根据三元运算符的要求对其进行重申)

然后,根据setcookie的值,将_config['cookie_lifetime']修改为使用预先计算的cookie有效性。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-