Проблемы с использованием LocalStorage для хранения файлов cookie в мобильном веб-приложении - PullRequest
3 голосов
/ 12 сентября 2011

Гуру СО

Я разместил веб-приложение на главном экране iOS и не хочу входить в систему каждый раз, когда приложение открывается. Поэтому я пытаюсь вставить файл cookie в LocalStorage.

Я использую следующий код, чтобы попытаться сохранить свои файлы cookie в LocalStorage для мобильного веб-приложения (код, скопированный с веб-приложения iphone ruby ​​gem). Но как-то не работает. Есть предложения?

Спасибо.

<script type="text/javascript">
(function(){
var RESEND_REQUEST = {{RESEND}};

function isFullScreen(){
  return navigator.userAgent.match(/WebKit.*Mobile/) &&
         !navigator.userAgent.match(/Safari/);
}

if(isFullScreen()){
  if(document.cookie == ''){
    var storedValues = localStorage.getItem('__cookie__');
      if(storedValues){
        var values = storedValues.split(';');
        for(var i=0; i < values.length; i++)
          document.cookie = values[i];
      }
      document.cookie = '_cookieset_=1';

    if(RESEND_REQUEST){
      window.location.reload();
    }

  }  

  var lastCookie = null;
  setInterval(function(){
    if(lastCookie != ''+document.cookie){
      lastCookie = ''+document.cookie;
      localStorage.setItem('__cookie__', ''+document.cookie);
    }
  },1000);

}
})()

1 Ответ

0 голосов
/ 03 февраля 2012

Есть пара вещей, которые соответствуют приведенному выше коду

1 . if(document.cookie == '')
Вышеприведенное утверждение не всегда предполагает, что возвращает true , даже когда вы открываете свое web_app с главного экрана iOS для в первый раз , т.е. document.cookie содержит некоторое значение (хотя и нежелательное, но все же) даже открытие с главного экрана (по крайней мере, что я нашел). Я призываю вас подсказать то же самое с предупреждением

Что-то вроде alert(document.cookie), прежде чем натолкнуться на упомянутое выше if clause Если да (document.cookie does contain some value), то, я думаю, вам нужно исправить вышеупомянутое условие if что-то вроде этого

>       if(!document.cookie.match(/_session_id/) ) {
>          // Rest of the code goes here
>       }

если вы используете ActiveRecord :: Base.session_store

или

>     if (!document.cookie.match(/{{YOUR SESSION KEY}}/) {
>               // Rest of the code goes here
>      }

ваш ключ сеанса при использовании Cookie Store "следующий ключ можно найти, посмотрев файл config/initializer/session_store.rb

2 . Как обратите внимание на код ниже

 localStorage.setItem('__cookie__', ''+document.cookie)

имеет смысл при чтении, хотя оно и есть поворот к нему за исключением document.cookie, который будет содержать cookie для приложения . и сохраняется браузером, но, как я заметил, document.cookie не оказывается таким же

например, браузер сохранил следующий файл cookie для моего приложения

* * Тысяча сорок-одина "__ cookieset = 1; KBD = 0EN-3; _session_id = 896c455928f3dd9e7bb0b660efb7063c" * * тысяча сорок два

но при проверке document.cookie я обнаружил, что он содержит

"__cookieset=1;KBD=0en-3;"

Обратите внимание, что document.cookie не содержит "_session_id=896c455928f3dd9e7bb0b660efb7063c"

Что необходимо, поскольку он используется различными гемами авторизации (devise или authlogic) , чтобы определить, имеет ли текущий пользователь допустимый сеанс?

поэтому я прошу вас сохранить cookie из объекта запроса, полученного из Rack::Request.new(env) в локальное хранилище

3 . размещение промежуточного программного обеспечения обеспечивает правильное размещение промежуточного программного обеспечения в нужном месте.

Если вы используете ActiveRecord :: Base.session_store, я думаю, код патча того же самого камня можно найти здесь решить вашу цель

...