odoo16跨域問題解決辦法--適用app端、web端、跨系統接口

Odoo的跨域問題:

由於瀏覽器的同源策略所引起的。同源策略是一種安全策略,它限制了一個源(協議、域名、端口)的文檔或腳本如何與另一個源的資源進行交互。

如果兩個源不同,則無法進行跨域交互。因此,如果Odoo應用程序在一個域名下運行,而客戶端在另一個域名下運行,則會出現跨域問題。

爲了解決Odoo的跨域問題,可以在Odoo的Nginx或Apache等Web服務器中進行配置。以下是一些可能的解決方法:

一、通過nginx配置

在Nginx中添加跨域頭信息
在Nginx的配置文件中添加以下內容:
location / {
    add_header 'Access-Control-Allow-Origin' '*';
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
    add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
    ...
}
這裏將Access-Control-Allow-Origin設置爲*,表示允許所有域名訪問。

 

二、如果是odoo內部應用的接口,一般在接口加上cors="*" 參數就行

      可以在Controller接口上配置參數,如:
      @http.route("/", type='json', auth="none", csrf=False, method=["POST"],website=True, cors="*")
      這樣前端在進行接口調用的時候,就可以調通了,跨域問題就解決了。

 

三、可以使用Odoo的CORS模塊來解決跨域問題,可以在請求頭中 加入。'Access-Control-Allow-Origin' '*' 永久解決

# -*- coding: utf-8 -*-
import json
import jinja2
import sys
import os
import logging

from odoo.http import JsonRequest, Response
from odoo.tools import date_utils

_logger = logging.getLogger(__name__)

def _json_response(self, result=None, error=None):
    # 自定義odoo接口返回數據格式,獲取到參數ext就直接返回json數據,否則就返回默認數據格式
    """
    {
        'jsonrpc': '2.0',
        'id': 12,
        'result': {}
    }
    """
    if self.endpoint and self.endpoint.routing.get('ext'):
        response = {}
        if error is not None:
            response = {
                'jsonrpc': '2.0',
                'id': self.jsonrequest.get('id')
            }
            response['error'] = error
        if result is not None:
            response = result
    else:
        # odoo返回的默認數據格式
        response = {
            'jsonrpc': '2.0',
            'id': self.jsonrequest.get('id')
        }
        if error is not None:
            response['error'] = error
        if result is not None:
            response['result'] = result

    mime = 'application/json'
    body = json.dumps(response, default=date_utils.json_default)

    return Response(
        body, status=error and error.pop('http_status', 200) or 200,
# 解決接口跨域問題,比如app與應用後臺的接口跨域 headers
=[('Content-Type', mime),('Access-Control-Allow-Origin', '*'),('Content-Length', len(body))] ) # 重寫JsonRequest中的_json_response方法 setattr(JsonRequest, '_json_response', _json_response)

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章