首页 > 其他分享 >跨域问题(CORS / Access-Control-Allow-Origin)

跨域问题(CORS / Access-Control-Allow-Origin)

时间:2023-05-03 16:31:58浏览次数:45  
标签:Control HTTP 请求 Access CORS 跨域


1、前言

      最近在项目中,调用Eureka REST接口时,出现了CORS跨越问题(Cross-origin resource sharing),在此与大家进行分享,避免多走些弯路。

      项目前端(http://localhost:9000)通过Ajax方式调用Eureka REST 接口(http://localhost:8761/eureka/apps)时,却没有任何反应,则通过F12查看日志发现出现“Access-Control-Allow-Origin“类 异常,详细如下:

…… http://localhost:8761/eureka/apps. Origin http://localhost:9000 is not allowed by Access-Control-Allow-Origin……

通过google,发现是由于CORS跨越问题造成的,解决办法无非有两种方式:响应头添加参数和添加过滤器,下面就详细说说CORS跨越问题的起因与详细解决办法。

2、CORS

跨域资源共享(CORS,Cross-origin resource sharing),是W3C标准,是一种机制,它使用额外的HTTP头来告诉浏览器 让运行在一个 origin (domain) 上的Web应用被准许访问来自不同源服务器上的指定的资源。当一个资源从与该资源本身所在的服务器不同的域或端口请求一个资源时,资源会发起一个跨域 HTTP 请求

     http://localhost:9000请求http://localhost:8761/eureka/apps就是违背了上述原则,即:请求服务器不同端口的另一个资源,出于安全原因,浏览器限制发起的跨源HTTP请求,则会出现本文开头提到的现象及异常。

     例如,XMLHttpRequest和Fetch API遵循同源策略, 这意味着使用这些API的Web应用程序只能从加载应用程序的同一个域请求HTTP资源,除非使用CORS头。

      跨域资源共享( CORS )机制允许 Web 应用服务器进行跨域访问控制,从而使跨域数据传输得以安全进行。浏览器支持在 API 容器中(例如 XMLHttpRequest 或 Fetch )使用 CORS,以降低跨域 HTTP 请求所带来的风险。


什么情况下存在跨域问题

  • 本文提到的由 XMLHttpRequest 或 Fetch 发起的跨域 HTTP 请求。
  • Web 字体 (CSS 中通过 @font-face 使用跨域字体资源),,因此,网站就可以发布 TrueType 字体资源,并只允许已授权网站进行跨站调用。
  • WebGL 贴图。
  • 使用 drawImage 将 Images/video 画面绘制到 canvas
  • 样式表(使用 CSSOM)。

 

面对CORS的限制,将如何解决呢

     世间万物完事,有因必有果,有果必有因。当然CORS的限制,官方也是给出了解决办法的。

     CORS标准新增了一组 HTTP 头字段(Access-Control-Allow-Origin),允许服务器声明哪些源通过浏览器有权限访问哪些资源。另外,规范要求,对那些可能对服务器数据产生副作用的 HTTP 请求方法(特别是 GET以外的 HTTP 请求,或者搭配某些 MIME 类型的 POST请求),浏览器必须首先使用 OPTIONS 方法发起一个预检请求(preflight request),从而获知服务端是否允许该跨域请求。服务器确认允许之后,才发起实际的 HTTP 请求。在预检请求的返回中,服务器端也可以通知客户端,是否需要携带身份凭证(包括Cookies和 HTTP 认证相关数据)。

      CORS请求失败会产生错误,但是为了安全,在JavaScript代码层面是无法获知到底具体是哪里出了问题。你只能查看浏览器的控制台以得知具体是哪里出现了错误。

如果有兴趣了解该机制剖析的可以参考https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS

3、解决办法

      在查阅大量资源,并了解过CORS机制后,解决办法实质必定会围绕Access-Control-Allow-Origin头。

跨域问题(CORS / Access-Control-Allow-Origin)_CORS

跨域问题(CORS / Access-Control-Allow-Origin)_HTTP_02

解决办法如下:

添加响应头

     在被请求资源中添加响应头信息"Access-Control-Allow-Origin:*

过滤器

    在本项目中添加如下过滤器:

/**
 * 解决跨域问题
 */
public class AccessControlAllowOriginFilter implements Filter {

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Allow-Credentials", "true");

     chain.doFilter(req, response);
   } 

   public void init(FilterConfig filterConfig) {

   } 

   public void destroy() {

   } 

}

注解方式

      在Spring Boot中拥有大量的注解,针对跨域问题,也提供了对应的注解@CrossOrigin,使用方法如下:

import java.util.HashMap;

import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author xcbeyond
 */
@RestController
@RequestMapping(value = "/api", method = RequestMethod.POST)
public class DemoController {
        
    @CrossOrigin(origins = "*")
    @RequestMapping(value = "/get")
    public String get() {
        ……
    }
}

 个人比较推荐使用上述的三种方式之一,其他方式请自己百度、谷歌吧

跨域问题(CORS / Access-Control-Allow-Origin)_Access_03

 

 

 

 

标签:Control,HTTP,请求,Access,CORS,跨域
From: https://blog.51cto.com/xcbeyond/6241412

相关文章

  • chrome关闭跨域
    目录背景关闭浏览器跨域方法关闭Chrome跨域小结参考背景今天需要在51World编辑平台调试API参数,出现页面跨域错误。本着快速处理原则,直接关闭Chrome的跨域限制,进行调试。关闭浏览器跨域方法AllowCORSChrome插件好久以前尝试是成功,但是这次没有成功,五一加班,不想折腾了.........
  • Cors跨域资源共享
    什么是CORSCORS(Cross-OriginResourceSharing,跨域资源共享)由一系列HTTP响应头组成,这些 HTTP 响应头决定浏览器是否阻止前端 JS 代码跨域获取资源。浏览器的同源安全策略默认会阻止网页“跨域”获取资源。但如果接口服务器配置了CORS相关的HTTP响应头,就可以解除浏览......
  • JAVA的Jdbc连接Access数据库
      Eclipse加入Access_JDBC30.jar:   程序如下:importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;importjava.sql.Statement;publicclassconn{publicstaticStringconnct(){try{......
  • 访问控制列表-ACL(access control list)
    访问控制列表的包含内容应用于路由器接口的指令列表,用于指定哪些数据包可以接收转发,哪些数据包需要被拒绝读取第三层和第四层头部种的信息(IP头部与TCP/UDP头部)根据预先定义好的规则对包进行过滤访问控制列表的种类基本访问控制列表(2000-2999)高级访问控制列表(3000-3999)适配二层的访......
  • Springboot @Test 给Controller接口 写 单元测试
    Springboot@Test给Controller接口写单元测试https://blog.csdn.net/qq_35387940/article/details/129140984?spm=1001.2101.3001.6650.8&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-8-129140984-blog-103569814.235%5Ev32......
  • iOS学习之UINavigationController…
    1、显示Toolbar 在RootViewController.m的-(void)viewDidLoad方法中添加代码,这样Toobar就显示出来了。1.setToolbarHidden:NOanimated:YES];2、在ToolBar上添加UIBarButtonItem新建几个UIBarButtonItem,然后以数组的形式添加到Toolbar中1.*one=[[UIBarButtonI......
  • 坑系列 (Angular 2+ ) -> 控制反转C(Inversion of Control)和 依赖注入DI(Dependency
        控制反转IOC和依赖注入DI这两个概念其实有太多优秀的文章,由浅入深,从不同的角度,再到不同的比喻进行了讲解,对于新手的我来说,看完之后,好像看了又没完全看,回头摸索实践,还是总有种似懂非懂,懂了又没完全懂(‘X了又没完全XXX’句式是2021年某个梗嘻嘻......
  • IDEA报错:Internal error :java.lang.illegalAccessErrorjiang
    IDEA报错:Internalerror:java.lang.illegalAccessErrorjiang报错Internalerror:java.lang.illegalAccessErrorjiang原因及解决方法今天在IDEA运行一个新项目时发生了这个报错,原因是该项目使用较新的JDK17版本,而我一直使用的IDEA2019.3.5不支持JDK17,将IDEA版本更换为2021.2.......
  • K8s报错:[preflight] WARNING: JoinControlPane.controlPlane settings will be ignore
    一、报错信息[preflight]WARNING:JoinControlPane.controlPlanesettingswillbeignoredwhencontrol-planeflagisnotset.[preflight]Runningpre-flightcheckserrorexecutionphasepreflight:[preflight]Somefatalerrorsoccurred:[ERRORFileAvailabl......
  • tileserver在配置文件中配置 CORS 可跨域
    您可以在Tileserver配置文件中设置Access-Control-Allow-Origin头来启用CORS,以便您的地图数据可以被跨域请求。以下是如何在Tileserver配置文件中设置CORS的步骤:打开Tileserver配置文件,通常位于您的tiles目录下的config.json文件中。找到headers配置项,这个配置项......