У меня есть система, разработанная на cakephp. Там у меня есть страница профиля клиента, которая показывает мне различную информацию, такую как заметки, телефонные звонки, прикрепленные файлы. Основная информация извлекается через Cakephp, другая информация, подобная приведенной выше, извлекается через запросы Ajax и отображается, как только данные получены. К сожалению, иногда и очень случайно (между каждым 10-м и 100-м запросами) я получаю 302 Ajax-запроса, выхожу из системы и перенаправляюсь на формуляр входа (который является основным путем перенаправления, если вы не вошли в систему).
Вы можете увидеть пример со страницы сети Google на картинках. На рисунке показано, что вызовы getPhonecalls, getNotes и getOutboxBook работают нормально, но вызов getFilesBackoffice возвращает 302, а затем запускает страницу входа. Также впоследствии getAllowedFiles называется нормально. Важно сказать, что это всегда другой вызов Ajax, и поэтому я предполагаю, что любой вызов Ajax может вызвать проблему. Успешный вызов Ajax возвращает JSON.
Я попытался реконструировать проблему, но мне кажется, что задача реконструировать ее невыполнима. Я также попытался отладить эту проблему и попытался проверить, в чем может быть ошибка ... но безуспешно. Также журнал ошибок php не дает никакой информации. Итак, затем я загрузил полную «Сетевую информацию» из Chrome с помощью «сохранить как HAR с контентом». Глядя на этот файл, кажется, что Cookie (с его Сессией) удален.
Вот выдержка из HAR со статусом 302:
"response": {
"status": 302,
"statusText": "Found",
"httpVersion": "HTTP/1.1",
"headers": [
{
"name": "Date",
"value": "Thu, 20 Dec 2018 09:47:27 GMT"
},
{
"name": "Server",
"value": "Apache/2.4.12 (Unix) OpenSSL/1.0.1p PHP/5.6.11 mod_perl/2.0.8-dev Perl/v5.16.3"
},
{
"name": "X-Powered-By",
"value": "PHP/5.6.11"
},
{
"name": "Content-Type",
"value": "text/html; charset=UTF-8"
},
{
"name": "Location",
"value": "http://localhost/stressfrei/HRMAppMig/Users/login"
},
{
"name": "Connection",
"value": "Keep-Alive"
},
{
"name": "Set-Cookie",
"value": "CAKEPHP=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/"
},
{
"name": "Set-Cookie",
"value": "CAKEPHP=2e5gke00430jdkd8ll5jl3ini3; expires=Fri, 21-Dec-2018 09:47:28 GMT; Max-Age=86400; path=/stressfrei/HRMAppMig/; HttpOnly"
},
{
"name": "Set-Cookie",
"value": "CAKEPHP=o3udvthe0rkmjt5djrjvnt3392; expires=Fri, 21-Dec-2018 09:47:28 GMT; Max-Age=86400; path=/stressfrei/HRMAppMig/; HttpOnly"
},
{
"name": "Keep-Alive",
"value": "timeout=5, max=95"
},
{
"name": "Content-Length",
"value": "0"
}
],
"cookies": [
{
"name": "CAKEPHP",
"value": "deleted",
"path": "/",
"expires": "2018-12-20T09:47:27.127Z",
"httpOnly": false,
"secure": false
},
{
"name": "CAKEPHP",
"value": "2e5gke00430jdkd8ll5jl3ini3",
"path": "/stressfrei/HRMAppMig/",
"expires": "2018-12-21T09:47:27.127Z",
"httpOnly": true,
"secure": false
},
{
"name": "CAKEPHP",
"value": "o3udvthe0rkmjt5djrjvnt3392",
"path": "/stressfrei/HRMAppMig/",
"expires": "2018-12-21T09:47:27.127Z",
"httpOnly": true,
"secure": false
}
],
"content": {
"size": 0,
"mimeType": "text/html",
"compression": 0
},
"redirectURL": "http://localhost/stressfrei/HRMAppMig/Users/login",
"headersSize": 717,
"bodySize": 0,
"_transferSize": 717
}
Вот отрывок из 200
"response": {
"status": 200,
"statusText": "OK",
"httpVersion": "HTTP/1.1",
"headers": [
{
"name": "Date",
"value": "Thu, 20 Dec 2018 09:52:39 GMT"
},
{
"name": "Server",
"value": "Apache/2.4.12 (Unix) OpenSSL/1.0.1p PHP/5.6.11 mod_perl/2.0.8-dev Perl/v5.16.3"
},
{
"name": "Connection",
"value": "Keep-Alive"
},
{
"name": "X-Powered-By",
"value": "PHP/5.6.11"
},
{
"name": "Content-Length",
"value": "2239"
},
{
"name": "Keep-Alive",
"value": "timeout=5, max=97"
},
{
"name": "Content-Type",
"value": "text/html; charset=UTF-8"
}
],
"cookies": [],
"content": {
"size": 2239,
"mimeType": "text/html",
"compression": 0,
"text": "HERE IS SOME JSON"
},
"redirectURL": "",
"headersSize": 287,
"bodySize": 2239,
"_transferSize": 2526
},
Вот пример моего вызова ajax.
this.ajaxCall = function(offset) {
var class_prefixTemp = this.class_prefix;
var self = this;
$.ajax({
//ajax options
type: "POST",
url: self.ajaxUrl,
data: {"offset": offset, "elements_per_page": this.elements_per_page, "conditions": this.conditions, "recursive": this.recursive},
dataType: 'json',
//handling return
success: function(result) {
//print out the data from the result
}
});
}
Ты хоть представляешь, как мне узнать, в чем моя проблема, чтобы наконец ее решить?






Наконец, проблема заключалась в настройке сеанса в core.php. В core.php CakePhp можно установить для сеанса autoRegenrate значение true. Это вызвало проблему, заключающуюся в том, что при загрузке новой страницы создается новый сеанс. Это может привести к тому, что длинные запросы Ajax работают с неправильным идентификатором сеанса, потому что он был обновлен, и поэтому идентификатор сеанса больше не подходит. Это привело к выходу из системы.
Наконец, мне пришлось отключить возобновление сеанса, установив для autoRegenerate значение false!