首页 > 其他分享 >跨域

跨域

时间:2024-02-23 16:56:36浏览次数:23  
标签:Control 跨域 Access Allow 允许 请求

 

1. 介绍

  1) 跨域问题:跨域问题是在网络中,当一个网络的运行脚本(通常时JavaScript)试图访问另一个网络的资源时,如果这两个网络的端口、协议和域名不一致时就会出现跨域问题。

    通俗讲,当一个请求的URL的端口、协议和域名三者之间任意一个与当前页面的URL不同即为跨域。

    换句话说,跨域问题就是浏览器的一种安全策略,限制了网页在不同源(Origin)之间进行的某些操作;如:读取网页的数据,资源等。

 

  2) 为什么会发生跨域问题:跨域问题的发生源于浏览器的同源策略(Same-Origin Policy),这是浏览器的一种安全机制(是一种约定),旨在防止恶网站户获取用户数据。同源策略要求一个网页的JavaScript脚本只能与同一个端口、协议和域名的资源进行交互,而不能访问与其来源不同的资源。

  如此设计为了保护用户的隐私和安全,防止恶意网站通过脚本等方式获取用户在其它网站的数据。如果缺少同源策略,浏览器的正常功能都会受到影响。

 

2. 跨域解决方案

  1) JSONP(JSON with Padding)JSONP时一种古旧的跨域解决方案,利用<script>标签不受同源策略的特性,通过动态创建<script>标签来获取跨域资源。

1.客户端(前端)构造一个包含了回调函数的 URL 请求,并将这个 URL 作为 <script> 标签的 src 属性值。
2.服务器端(后端)接收到这个请求后,解析其中的回调函数名,并将相应的 JSON 数据作为参数传入该回调函数。
3.客户端定义了一个全局的 JavaScript 函数,其函数名就是前面提到的回调函数名,服务器返回的 JSON 数据作为该函数的参数。
4.当浏览器加载这个包含 JSON 数据的 JavaScript 文件时,就会立即执行这个全局函数,从而完成跨域数据的获取和处理。

  JSONP的缺点:

  安全性问题:不受同源策略的限制,无法保证从服务器返回的数据是否安全可信;

  仅支持GET请求:限制了在处理其他类型的HTTP请求;

  依赖回调函数:需要在客户端命名一个全局的JavaScript函数来处理返回的数据,意味着客户端需提前约定好回调函数的名称,容易引发命名冲突和管理困难;

  无法处理错误信息:JSONP请求没有像Ajax请求那样的错误处理机制,无法捕获服务器返回的HTTP状态码和错误信息,使得调试和处理错误变得困难;

  总之,并不建议使用JSONP方式解决跨域问题。

 

  2) 添加响应头

  跨域资源共享(CORS):是一种跨域解决方案,通过在服务器端添加特定的响应头来允许跨域请求。

  Access-Control-Allow-Origin: 指定允许访问该资源的源,可以是单个源或者是通配符 *,表示允许所有源访问该资源。

  例:在Java 控制器(Controller)方法中,使用 HttpServletResponse 对象来设置响应头信息。在 Controller 方法中设置 CORS 响应头,指定允许访问的来源(origins)。

@RestController
public class CrossOriginController {

    @CrossOrigin(origins = "http://127.0.0.1:8080") // 只允许单个来源
    @CrossOrigin(origins = {"http://moudu.com", "http://mouxun.com"})   // 允许多个来源
    public String Test(HttpServletResponse httpServletResponse) {
        return "Hello, CORS.";
    }

}

  注意:在Spring Framework内,@CrossOrigin注解不可以在同一个方法内多次使用。可以在同一个控制层的每个方法内使用。

  常用CROS响应头:

1.Access-Control-Allow-Origin: 指定允许访问该资源的源,可以是单个源或者是通配符 *,表示允许所有源访问该资源。
2.Access-Control-Allow-Methods: 指定允许的 HTTP 方法,例如 GET、POST 等。
3.Access-Control-Allow-Headers: 指定允许的 HTTP 头字段。
4.Access-Control-Allow-Credentials: 指定是否允许发送 Cookie。
5.Access-Control-Expose-Headers: 指定哪些 HTTP 头字段可以在客户端进行访问。
6.Access-Control-Max-Age: 指定预检请求的有效期,单位为秒。

 

  3) 配置文件  

  在Spring Boot中,可以使用配置文件设置全局的跨域策略。然后让Spring Boot应用程序在每个请求中配用这些配置。

  项目需要简单的全局跨域配置,并且习惯于基于配置的开发模式,配置文件方式更适合。

  优点:

  • 配置简单,一次配置后整个应用程序都会生效;
  • 简单的全局跨域配置,适合于小型项目或不需要复杂跨域策略的应用;

  application.properties 文件中配置跨域策略:

# 允许的跨域来源
cors.allowed-origins=http://127.0.0.1:8080,http://moudu.com,http://mouxun.com

# 允许的跨域方法
cors.allowed-methods=GET,POST,PUT,DELETE

# 允许的跨域头
cors.allowed-headers=Content-Type,Authorization

# 是否允许发送 Cookie
cors.allow-credentials=true

# 预检请求的有效期,单位为秒
cors.max-age=3600
@Configuration
public class CorsConfig implements WebMvcConfigurer {

    @Value("${cors.allowed-origins}")
    private String allowedOrigins;

    @Value("${cors.allowed-methods}")
    private String allowedMethods;

    @Value("${cors.allowed-headers}")
    private String allowedHeaders;

    @Value("${cors.allow-credentials}")
    private boolean allowCredentials;

    @Value("${cors.max-age}")
    private long maxAge;

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins(allowedOrigins.split(","))
                .allowedMethods(allowedMethods.split(","))
                .allowedHeaders(allowedHeaders.split(","))
                .allowCredentials(allowCredentials)
                .maxAge(maxAge);
    }
}

 

  4) 过滤器

  简单的Servlet过滤器,用于处理跨域资源共享(CORS)请求。

  项目需要更灵活地控制跨域策略,甚至根据请求的具体情况动态设置跨域响应头,过滤器方式更合适。

  优点:

  • 更灵活,根据具体的请求情况动态,设置跨域响应头;
  • 可以在过滤器中编写复杂的逻辑,对请求进行定制化处理;
@Component
public class HttpFilter implements Filter {
    /**
     *
     CROS跨域常用header
     Access-Control-Allow-Origin: 允许哪些ip或域名可以跨域访问
     Access-Control-Max-Age: 表示在多少秒之内不需要重复校验该请求的跨域访问权限
     Access-Control-Allow-Methods: 表示允许跨域请求的HTTP方法,如:GET,POST,PUT,DELETE
     Access-Control-Allow-Headers: 表示访问请求中允许携带哪些Header信息,如:Accept、Accept-Language、Content-Language、Content-Type
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //*号表示对所有请求都允许跨域访问
        HttpServletResponse res = (HttpServletResponse) response;
        res.addHeader("Access-Control-Allow-Credentials", "true");
        res.addHeader("Access-Control-Allow-Origin", "*");
        res.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
        res.addHeader("Access-Control-Allow-Headers", "Content-Type,X-CAF-Authorization-Token,sessionToken,X-TOKEN");
        if (((HttpServletRequest) request).getMethod().equals("OPTIONS")) {
            response.getWriter().println("Success");
            return;
        }
        chain.doFilter(request, response);
    }
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
    @Override
    public void destroy() {
    }
}

  

  5) Nginx跨域

  Nginx是一个高性能的反向代理服务器,也可用作Web服务器、负载均衡等。通过Nginx,可以实现跨域请求的解决方案。一般解决的是前端静态页面在不同服务器间的访问。

  

  使用Nginx设置跨域请求头:

  1. 安装和配置Nginx;
  2. 编辑Nginx文件;
  3. 设置跨域设置;
location / {
    # 添加以下跨域配置
    add_header Access-Control-Allow-Origin *;
    add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS, PUT, DELETE';
    add_header Access-Control-Allow-Headers 'Origin, X-Requested-With, Content-Type, Accept, Authorization';
    
    # 支持 OPTIONS 请求
    if ($request_method = 'OPTIONS') {
        add_header Content-Length 0;
        add_header Content-Type text/plain;
        return 204;
    }
}

  4. 重启 Nginx 服务: 保存并关闭配置文件后,重新加载 Nginx 配置,以使更改生效:sudo systemctl reload nginx

  或

server/ {
  listen 80;
  server_name test01.xqiangme.to;
  #允许跨域请求的域,* 代表所有
  add_header 'Access-Control-Allow-Origin' *;
  #允许带上cookie请求
  add_header 'Access-Control-Allow-Credentials' 'true';
  #允许请求的方法,比如 GET/POST/PUT/DELETE
  add_header 'Access-Control-Allow-Methods' *;
  #允许请求的header
  add_header 'Access-Control-Allow-Headers' *;

  location /index.html {
  alias /home/nginx/static_html/index_test01.html
  }
}

 

标签:Control,跨域,Access,Allow,允许,请求
From: https://www.cnblogs.com/warmNest-llb/p/18029911

相关文章

  • 跨域 解决办法:利用 Access-Control-Allow-Origin
    ASP.NET中WebAPI解决跨域问题https://www.jb51.net/article/240038.htm 传统的跨域请求没有好的解决方案,无非就是jsonp和iframe,随着跨域请求的应用越来越多,W3C提供了跨域请求的标准方案(Cross-OriginResourceSharing)。IE8、Firefox3.5及其以后的版本、Chrome浏览器、Saf......
  • CORS就是跨域吗?
    首先,跨域的域是什么?跨域的英文是:Cross-Origin。Origin 中文含义为:起源,源头,出生地。在跨域中,"域"指的是一个Web资源(比如网页、脚本、图片等)的源头。包括该资源的协议、主机名、端口号。在同源策略中,如果两个资源的域相同,则它们属于同一域,可以自由进行交互和共享数据。反之......
  • c#使用webView2 访问本地静态html资源跨域问题 || Cors
    背景在浏览器中访问本地静态资源html网页时,可能会遇到跨域问题如图。 是因为浏览器默认启用了同源策略,即只允许加载与当前网页具有相同源(协议、域名和端口)的内容。WebView2默认情况下启用了浏览器的同源策略,即只允许加载与主机相同源的内容。所以如果我们把静态资源发布到ii......
  • 跨域问题
    文章目录前言一、为什么会跨域1.什么是源2.URL结构3.同源不同源举......
  • 跨域问题
    1,概念跨域并不是请求发不出去,请求能发出去,服务端能收到请求并正常返回结果,只是结果被浏览器拦截了。跨域问题的产生是由于浏览器的同源策略。同源策略(Same-OriginPolicy)是一种浏览器安全策略,用于限制在浏览器中加载的网页脚本与来自不同源的资源进行交互。同源指的是协议(如......
  • 跨域问题解决
    跨域举例A网站部署在localhost:63343请求loocalhost:8080/api/user/add,就会出现跨域问题。同源策略同源策略:协议,主机,端口,只有这三者全部相同时,才可以相互访问。现在接口地址为101.10.11.1X:8081,请判断以下哪些可以通过:访问地址描述结果https://127.0.0.1:808......
  • 跨域传文件时 如何确保数据安全可控传输共享?
    跨域传文件指的是在不同的域(Domain)之间安全地传输文件,这通常涉及到安全域、组织域、不同地理位置域之间。在跨域数据文件共享过程中,既要保障合法用户的正常阅读文件,又要防范在传播过程中的不可控,敏感文件的机密性受到极大挑战,如何防范敏感文件泄露,保护关键数据资产成为各组织的......
  • Vite+Vue3项目如何获取环境配置,并解决前端跨域问题
    步骤根目录新建.env.development和.env.production文件package.json配置启动参数vite命令启动项目时,指定mode参数,加载vite.config.ts文件。"dev":"vite--host0.0.0.0--port8093--modedevelopment","prod":"vite--port8093--host0.0.0.0--modepr......
  • 前后端跨域竟然不需要加注解!
    众所周知前后端跨域一直是让人头疼的问题。那什么是跨域呢?出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策......
  • 谷歌新版本跨域错误深度剖析与解决:request client is not a secure context and the
    原文地址:https://blog.csdn.net/Flywithdawn/article/details/128253604 快速解决: ======================================================最近在测试http服务时,谷歌浏览器报了以下错误“Therequestclientisnotasecurecontextandtheresourceisinmore-privat......