FED实验室 - 专注WEB端开发和用户体验

Ajax请求中Session超时的不同处理

PHP 煦涵 4195℃ 0评论

一、Ajax请求中的超时处理

我们都知道同步请求中比较容易处理,直接echo就可以,但是异步处理时是个问题,但是我们可以根据响应头中的X-Requested-With字段来区分不同的请求类型。下面是基本的处理

// PHP:
function is_xhr_request() {
	$arr_headers = getallheaders();

	return 
	$arr_headers['X-Requested-With'] 
	&& 'xmlhttprequest' === strtolower($arr_headers['X-Requested-With']);
}

function interceptor() {

	if(/*user logged in*/) {

		// php.ini中可配置GC 最大生存时间 session.gc_maxlifetime = 1440

		$max_session_timeout = 1000;
		if( isset($_SESSION['last_access']) 
			&& (time() - $_SESSION['last_access']) > $max_session_timeout ) {
			// 超时处理
			unset($_SESSION['last_access']);

			session_destroy();

			//判断请求类型,是否是ajax请求
			if(is_xhr_request()) {

				
				 //方法一:在响应头添加特殊字段供前端判断
                                 header("HTTP/1.1 404 http://www.login.com");

				 //方法二:直接返回特殊字符串供前端判断 echo "xxx"
				echo "session_timeout";
			}else {
				echo '<script>location.href="login.php"</script>';
			}

			die();
		}else {
			$_SESSION['last_access'] = time(); 
		}
	}else {
		// 没有登录处理
	}
}

/* ---------------------- 分割线 ---------------------------*/
// Javascript
// 配置ajax默认参数
$.ajaxSetup({
    complete: function (xhr, textStatus) {
        var str_timeout = xhr.responseText;
        if ("session_timeout" === str_timeout) {
            window.top.location = "login.php";
        }
    }
});

二、Session相关知识

1. Session 的工作机制

PHP的session会话是通过唯一的会话ID来驱动的,会话ID是一个加密的随机数字,由PHP生成,在会话的生命周期中都会保存在客户端。我们知道客户端(也就是浏览器)保存数据的地方只有cookie,所以PHP的会话ID一般保存在用户机器的cookie中。了解cookie后我们知道,浏览器是可以禁用cookie的,这样会话就会失效。所以PHP会话控制还有一种模式,就是在URL中传递会话ID。如果在浏览网站时我们稍加留心的话,有些URL中有一串看起来像随机数字的字符串,那么其实很有可能就是URL形式的会话控制。

2. Session是如何保存的

Session以文件的形式保存,可以在PHP的配置文件php.ini中的session.save_path字段发现或修改Session文件的保存位置。
session文件的命名格式为"sess_[PHPSESSID]" => "sess_daa4g5a2kd3s9tsl324s07q4f4"。

3. Session 的PHPSESSID实现原理

PHP使用默认的session.save_handler = files方式时,PHPSESSIONID通过MD5或SHA-1算法生成,可在php.ini中的配置:

; Select a hash function for use in generating session ids.
; Possible Values 
;   0  (MD5 128 bits)
;   1  (SHA-1 160 bits)
session.hash_function = 0

PHPSESSIONID = hash_func(客户端IP + 当前时间(秒)+ 当前时间(微妙)+ PHP自带的随机数生产器)

4. PHP是如何确定要调用哪个session文件的?

PHP是根据一个名为PHPSESSID(会话id)的Cookie(PHPSESSID=daa4g5a2kd3s9tsl324s07q4f4),根据它的值,确定调用哪个Session文件。在浏览器的控制台中,在请求头中可以看到一个cookie名为PHPSESSID的,如果它的值为"daa4g5a2kd3s9tsl324s07q4f4",当访问服务器时,就会调用session存储目录下名为"sess_daa4g5a2kd3s9tsl324s07q4f4"的文件。

PS: Cookie的名字PHPSESSID是可以改的,在php.ini中 session.name = PHPSESSID就是设置该cookie的名字。

5. session的几个操作

session_start();

// 设置
$_SESSION['username'] = time();

// 获取
$_SESSION['username']

// 销毁变量
unset($_SESSION['username'])

// 删除对应的session文件
session_destroy()

6. 如果遍历session文件内容?

通过如下设置:
$_SESSION['login']['last_access'] = time();
$_SESSION['login']['username'] = "benjamin";

生成的session文件如下:
login|a:2:{s:11:"last_access";i:1421490102;s:8:"username";s:8:"benjamin";}

解释上面文件内容:
上面session保存的是一个数组,{}里为表示数组的内容,其中
a:2表示login为array且长度为2
s:11:"last_access"表示last_access为string类型且长度为11
i:1421490102表示integer且值为1421490102

7. php.ini中的session配置项

[Session]
session.save_handler = files

; Argument passed to save_handler.  In the case of files, this is the path
; where data files are stored. Note: Windows users have to change this
; variable in order to use PHP's session functions.
session.save_path = "g:/wamp/tmp"

session.use_cookies = 1

session.cookie_secure =

session.use_only_cookies = 1

; Name of the session (used as cookie name).
session.name = PHPSESSID

session.auto_start = 0

session.cookie_lifetime = 0

; The path for which the cookie is valid.
session.cookie_path = /

; The domain for which the cookie is valid.
session.cookie_domain =

session.cookie_httponly = 

session.serialize_handler = php

session.gc_probability = 1

session.gc_divisor = 1000

; After this number of seconds, stored data will be seen as 'garbage' and
; cleaned up by the garbage collection process.
session.gc_maxlifetime = 1440

session.bug_compat_42 = On

session.bug_compat_warn = On

session.referer_check =

session.entropy_length = 0

session.entropy_file =

session.entropy_length = 16

session.cache_limiter = nocache

session.cache_expire = 180

session.use_trans_sid = 0

; Select a hash function for use in generating session ids.
; Possible Values 
;   0  (MD5 128 bits)
;   1  (SHA-1 160 bits)
session.hash_function = 0

session.hash_bits_per_character = 5

下面是「FED实验室」的微信公众号二维码,欢迎扫描关注:

FED实验室

行文不易,如有帮助,欢迎打赏!

赞赏支持or喜欢 (3)or分享 (0)
捐赠共勉
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址