奈飞|Ajax跨域请求的两种实现方式( 四 )


        window.addEventListener('message' this.onMessage)
    

    render() {
        return null
    

                
export default AjaxRequest

如此实现后 , 发现iframe因为跨域问题无法加载
因为后端是由Django实现的 , 经过查阅发现 , 在views中需要进行处理 , 添加xframe_options_exempt装饰器 , 实现跨域加载iframe 。
@xframe_options_exempt
def indexCross(request *args **kwargs):
    return render(request 'index.html' {)

功能能够正常请求 , 但是请求中cookie并没有正常传送 。
经过排查发现 , 对于跨域的iframe , google浏览器默认对于cookie中SameSite这个参数是LAX , 会导致只有同源才能设置服务器返回的Set-Cookie 。 所以需要将服务器返回的Set-Cookie中指定SameSite为None , 这样前端才能成功设置Cookie 。
于是服务端Django引入了中间件django-cookies-samesite 。 settings.py进行如下修改:
INSTALLED_APPS = [
    ...
    'corsheaders'
    ...



# 中间件request按照注册顺序顺序执行 , response按照注册顺序倒序执行
MIDDLEWARE = [
    'django_cookies_samesite.middleware.CookiesSameSite' # 此处response需要最后执行
    ...



SESSION_COOKIE_SECURE = True
SESSION_COOKIE_SAMESITE = 'None'

至此实现了iframe方式跨域 。
四、CORS方案这个需要前端Jquery加入两个参数:
jquery.ajax({
    ...
    xhrFields: {
        withCredentials: true
    
    crossDomain: true
)

然后服务端需要开启跨域请求支持 。 Django下引入中间件django-cors-headers 。 settings.py下如下设置:
MIDDLEWARE = [
    ...
    'corsheaders.middleware.CorsMiddleware' # 这个位置越高越好 , 至少要高于CommonMiddleware
    ...



# 跨域配置
CORS_ALLOW_CREDENTIALS = True
# CORS_ORIGIN_ALLOW_ALL = True
CORS_ORIGIN_WHITELIST = [
    'https://www.xxx.com'# 域名B


CORS_ALLOW_METHODS = [
    'DELETE'
    'GET'
    'OPTIONS'
    'PATCH'
    'POST'
    'PUT'
    'VIEW'


CORS_ALLOW_HEADERS = [
    'XMLHttpRequest'
    'X_FILENAME'
    'accept-encoding'
    'authorization'
    'content-type'
    'dnt'
    'origin'
    'user-agent'
    'x-csrftoken'
    'x-requested-with'
    'Pragma'
    'cache-control'



此方案也需要和iframe一样 , 解决cookie中SameSite的问题 。
至此CORS方案跨域也实现了 。