ElasticSearch——跨域访问

时间:2024-03-19 20:29:41

跨域请求:

ES服务器安装部署成功之后

从另外一个域的浏览器访问ES服务器数据,会出现跨域的问题。

抛出错误No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. The response had HTTP status code 503.

查看ES相关资料,得知ES默认是不允许跨域的

但是我们可以通过ES的配置文件:elasticsearch.yml中添加如下参数:

[plain] view plain copy
  1. #开启跨域访问支持,默认为false  
  2.   
  3. http.cors.enabled: true  
  4.   
  5. #跨域访问允许的域名地址,(允许所有域名)以上使用正则  
  6.   
  7. http.cors.allow-origin: /.*/   

通过以上配置,并重新启动ES服务器,就可以*访问ES服务器

但是允许访问的域名地址为“*“是高风险的,这说明部署的ES实例允许被任何地方跨域请求。

因此实际使用最好根据需求设定允许访问的域名地址。


ES请求cache:false

修改好配置文件并重启ES,再次查询,却发现又抛出另一个错误。

错误代码如下:

[plain] view plain copy
  1. {  
  2.     "error": {  
  3.         "root_cause": [  
  4.             {  
  5.                 "type": "illegal_argument_exception",  
  6.                 "reason": "request [/my_index/my_type/_search] contains unrecognized parameter: [_]"  
  7.             }  
  8.         ],  
  9.         "type": "illegal_argument_exception",  
  10.         "reason": "request [/my_index/my_type/_search] contains unrecognized parameter: [_]"  
  11.     },  
  12.     "status": 400  
  13. }  

JS请求代码如下:

[javascript] view plain copy
  1. <script>  
  2.   $.ajax({  
  3.     url: "http://192.18.1.12:9222/my_index/my_type/_search",  
  4.     type: "get",  
  5.     data: { size: 0 },  
  6.     cache: false,  
  7.     success: function (result) {  
  8.       console.log(result);  
  9.     },  
  10.     error: function (err) {  
  11.       console.log(err);  
  12.     }  
  13.   });  
  14.   
  15. </script>  
请求的参数中,并没有 _  这个参数。

ElasticSearch——跨域访问

这是怎么回事呢?

查证之后,原来这是jQuery 的ajax cache选项的处理方式

其处理方式如下:

[javascript] view plain copy
  1. if ( s.cache === false && s.type.toLowerCase() == "get" )    
  2.     s.data = (s.data ? s.data + "&" : "") + "_=" + (new Date()).getTime();    

如果不缓存的话,就在请求的url的data上添加一个时间戳,这样就不会缓存数据了,因为每次请求的url都不一样。

但是这里是直接请求的ES的resultful API ,其并不会忽略参数"_",而且还验证每个参数是否合法,这里就会报错。

所以去掉对缓存的配置 cache:false,默认的cache配置为true。


[plain] view plain copy
  1. $.ajax({  
  2.    url: "http://192.18.1.12:9222/my_index/my_type/_search",  
  3.    type: "get",  
  4.    data: { size: 0 },  
  5.    success: function (result) {  
  6.      console.log(result);  
  7.    },  
  8.    error: function (err) {  
  9.      console.log(err);  
  10.    }  
  11.  });  

再次执行查询,正确返回预期的结果。

当然也可以直接在浏览器输入地址查询,也能够正确返回。


原文:https://blog.csdn.net/shiyaru1314/article/details/71557228