使用LocalStorage在移动Web应用程序中存储Cookie时遇到问题

时间:2011-09-11 22:13:01

标签: html5 session cookies local-storage

SO的大师

我已将一个网络应用程序发布到iOS主屏幕&每次打开应用程序时都不想登录。所以我试图将cookie推送到LocalStorage。

我正在使用以下代码尝试将我的cookie存储在LocalStorage中以用于移动Web应用程序(从iphone web app 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 :(得分:0)

在上面的代码中有几件事适合

<强> 1 即可。 if(document.cookie == '')
     上述声明并不总是假设返回true ,即使您从iOS主屏幕打开web_app 第一次,即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"

哪个必须由各种授权gem(设计或authlogic)用来确定当前用户是否有有效的会话?

所以我请求你存储来自Rack::Request.new(env)的请求对象的cookie 进入localStorage

第3 即可。 中间件放置确保您将中间件放置在正确的位置。

如果你使用ActiveRecord :: Base.session_store我想可以找到相同gem的补丁码here解决你的目的