2012-06-22 76 views
11

因此,基于信息在这里Safari 3rd party cookie iframe trick no longer working?这里Missing cookies on iframe in safari 5.1.5很显然,老招数不会工作:的Django的iFrame Safari浏览器修复

from django.http import HttpResponse 
from django.conf import settings 


SESSION_COOKIE_NAME = getattr(settings, 'SESSION_COOKIE_NAME') 

class SafariIFrameFixMiddleware(object): 
    """ 
    Middleware fixes sessions with Safari browser in iframes 

    Safari default security policy restricts 
    cookie setting in first request in iframe 

    Solution is to create hidden form to preserve GET variables 
    and REPOST it to current URL 
    """ 
    def process_request(self, request): 
     if request.META['HTTP_USER_AGENT'].find('Safari') != -1 \ 
       and request.META['HTTP_USER_AGENT'].find('Chrome') == -1 \ 
       and SESSION_COOKIE_NAME not in request.COOKIES \ 
       and 'cookie_fix' not in request.GET: 
      html = """<html><body><form name='cookie_fix' method='GET' action='.'>""" 
      for item in request.GET: 
       html += "<input type='hidden' value='%s' name='%s' />" % (request.GET[item], item) 
      html += "<input type='hidden' name='cookie_fix' value='1' />" 
      html += "</form>" 
      html += '''<script type="text/javascript">document.cookie_fix.submit()</script></html>''' 
      return HttpResponse(html) 
     else: 
      return 

所以我正在寻找解决这个问题新途径。

它似乎需要打开窗口(用户权限/点击或它将被Safari浏览器阻止)并开始会话。

问题是,完全相同的弹出页面将实现所有中间件,因此它不会在项目内部始终可用(希望尽可能少的侵入修复)。

此外django会话启动也是在中间件内部,我还没有找到任何手动启动的干净方式。有什么建议么?

+0

为什么您需要手动启动会话?如果你的弹出窗口来自Django并通过中间件,你会自动获得新的会话,如果它不存在的话。 – Anentropic

+0

为什么在iframe中不使用js和post进行替换? – Efazati

回答

相关问题