• 跨域、跨域问题


    跨域(CORS)是一种允许当前域(domain)的资源(比如html/js/web service)被其他域(domain)的脚本请求访问的机制,通常由于同域安全策略(the same-origin security policy)浏览器会禁止这种跨域请求。

    跨域问题(CORS PROBLEM)是浏览器同源策略导致访问失败的问题。

    1.跨域产生的场景

    1)不同协议(http/https)
    2)不同IP
    3)不同端口

    2.前端解决方案

    1)jsonp
    2)nodeJs服务器代理


        
    3.后端解决方案

    1)nginx反向代理解决跨域
    2)服务端设置Response Header(响应头部)的Access-Control-Allow-Origin
    3)在需要跨域访问的类和方法中设置允许跨域访问(如Spring中使用@CrossOrigin注解);
    4)继承使用Spring Web的CorsFilter(适用于Spring MVC、Spring Boot)
    5)实现WebMvcConfigurer接口(适用于Spring Boot)


    4.后端解决示例

    4.1 过滤器

    1. @WebFilter
    2. public class CorsFilter implements Filter {  
    3.     @Override
    4.     public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {  
    5.         HttpServletResponse response = (HttpServletResponse) res;  
    6.         response.setHeader("Access-Control-Allow-Origin", "*");  
    7.         response.setHeader("Access-Control-Allow-Methods", "*");  
    8.         response.setHeader("Access-Control-Max-Age", "3600");  
    9.         response.setHeader("Access-Control-Allow-Headers", "*");
    10.         response.setHeader("Access-Control-Allow-Credentials", "true");
    11.         chain.doFilter(req, res);  
    12.     }
    13. }

    4.2 拦截器

    1. @Component
    2. public class CrossInterceptor extends HandlerInterceptorAdapter {
    3.     @Override
    4.     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    5.         response.setHeader("Access-Control-Allow-Origin", "*");
    6.         response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
    7.         response.setHeader("Access-Control-Max-Age", "3600");
    8.         response.setHeader("Access-Control-Allow-Headers", "*");
    9.         response.setHeader("Access-Control-Allow-Credentials", "true");
    10.         return true;
    11.     }
    12. }

    4.3 实现 WebMvcConfigurer

    1. @Configuration
    2. @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection")
    3. public class CrosConfig implements WebMvcConfigurer {
    4.     @Override
    5.     public void addCorsMappings(CorsRegistry registry) {
    6.         registry.addMapping("/**")   // 拦截所有的请求
    7.                 .allowedOrigins("http://www.xxx.com")   // 可跨域的域名,可以为 *
    8.                 .allowCredentials(true)
    9.                 .allowedMethods("*")   // 允许跨域的方法,可以单独配置
    10.                 .allowedHeaders("*");   // 允许跨域的请求头,可以单独配置
    11.     }
    12. }

    4.4 使用Nginx配置

    1. location / {
    2.    add_header Access-Control-Allow-Origin *;
    3.    add_header Access-Control-Allow-Headers X-Requested-With;
    4.    add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
    5.    if ($request_method = 'OPTIONS') {
    6.      return 204;
    7.    }
    8. }

    4.5 使用@CrossOrgin注解

    1. @CrossOrigin //在Controller使用
    2. @RestController
    3. @RequestMapping("/test")
    4. public class TestController {
    5.     @GetMapping("/test1")
    6.     public String test1() {
    7.          return "test1";
    8.     }
    9.     @CrossOrigin // 在具体接口上使用
    10.     @GetMapping("/test2")
    11.     public String test2() {
    12.       return "test2";
    13.     }
    14. }

    4.6 Spring Cloud Gateway

    1. spring: 
    2.   cloud:
    3.     gateway:
    4.       globalcors:
    5.         cors-configurations:
    6.           '[/**]':
    7.             allow-credentials: true
    8.             allowed-origins:
    9.               - "http://xb.abc.com"
    10.               - "http://sf.xx.com"
    11.             allowed-headers: "*"
    12.             allowed-methods:
    13.               - OPTIONS
    14.               - GET
    15.               - POST
    16.               - DELETE
    17.               - PUT
    18.               - PATCH
    19.             max-age: 3600

  • 相关阅读:
    Python自动化操作:简单、有趣、高效!解放你的工作流程!
    基于显扬科技自主研发3D机器视觉HY-M5在传送带箱包贴标签中的应用
    大型语言模型(LLM, Large Language Models)基模和 Chat 模型之间的区别
    nginx 编译全参数
    Zookeeper-开源客户端 之 ZkClient
    4. Linux-riscv内存管理17-20问
    Vue项目实战——【基于 Vue3.x + NodeJS】实现的课程表排课系统二(week-title)
    cv2.calibrateCamera函数
    博客园又崩了,这个锅要不要阿里云背?
    Linux - 基本背景
  • 原文地址:https://blog.csdn.net/qq_34253002/article/details/126927332