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);
}
})()
答案 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 即可。注意以下代码
在阅读时它确实有意义,但它有扭曲 除了 document.cookie之外,其他人将包含应用程序的cookie 并且由浏览器存储但是我注意到 document.cookie 并不是相同的localStorage.setItem('__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解决你的目的