我的 Flask 应用程序的用户在https://example.com/login登录,但他们可以设置自定义域,如http://customdomain.com
我希望能够在用户访问他们的自定义域时访问 Flask 会话变量,以便在用户登录时我可以显示删除和修改用户界面控件。
当然,浏览器会阻止从创建它们的域以外的域访问 cookie。
关于如何解决这个问题的任何想法或方法?
我的 Flask 应用程序的用户在https://example.com/login登录,但他们可以设置自定义域,如http://customdomain.com
我希望能够在用户访问他们的自定义域时访问 Flask 会话变量,以便在用户登录时我可以显示删除和修改用户界面控件。
当然,浏览器会阻止从创建它们的域以外的域访问 cookie。
关于如何解决这个问题的任何想法或方法?
这就是我所做的;似乎运作良好。我使用withCredentials
set to对服务器进行 AJAX JSONP 调用true
。服务器获取会话 cookie 并告诉客户端用户是否登录。根据响应,我可以向用户显示其他用户界面元素。
<script>
$(".logged_in").hide();
request = $.ajax({
url: "http://example.com/ping/",
type: "GET",
dataType: "jsonp",
xhrFields: {
withCredentials: true
}
});
request.done(function (response, textStatus, jqXHR){
// log a message to the console
if (response['logged_in'])
{
$(".logged_in").show();
}
});
request.fail(function (jqXHR, textStatus, errorThrown){
// log the error to the console
console.error("The following error occurred: " + textStatus, errorThrown);
console.log("jqXHR: " + JSON.stringify(jqXHR))
});
</script>
服务器代码:
def jsonp(func):
"""Wraps JSONified output for JSONP requests."""
@wraps(func)
def decorated_function(*args, **kwargs):
callback = request.args.get('callback', False)
if callback:
data = str(func(*args, **kwargs).data)
content = str(callback) + '(' + data + ')'
mimetype = 'application/javascript'
return current_app.response_class(content, mimetype=mimetype)
else:
return func(*args, **kwargs)
return decorated_function
@app.route('/ping/')
@jsonp
def ping():
if 'user_id' in session:
print "session ping: %s" % session
return jsonify(logged_in='true')
else:
print "session ping: not logged in"
return jsonify(logged_in="false")