• 前后端分离跨域问题解决方案


    Vue和SpringBoot的跨域问题的4中解决方案

    跨域问题产生的原因:浏览器的保护机制,同源策略协议,域名,端口;三个中有一个不同就会产生跨域问题

    解决方案(后端):

    1.@CrossOrigin注解:

    在目标方法上使用@CrossOrigin注解

     
    1. @CrossOrigin
    2.      @GetMapping("/captcha")
    3.      public void captcha(HttpServletResponse response, HttpServletRequest request) throws IOException {
    4.          SpecCaptcha captcha = new SpecCaptcha(150,40);
    5.          String text = captcha.text();
    6.          System.out.println(text);
    7.          captcha.out(response.getOutputStream());
    8.     }

    2.在配置类中添加CORS过滤器

    在配置类中写过滤器一般用@bean注解

     
    1. @Configuration
    2.  public class CorsConfig {
    3.      @Bean
    4.      public CorsFilter corsFilter(){
    5.  //       创建一个CorsConfiguration对象,用于存储CORS配置。
    6.          CorsConfiguration corsConfiguration = new CorsConfiguration();
    7.          corsConfiguration.addAllowedOrigin("*");
    8.          corsConfiguration.addAllowedMethod("*");
    9.          corsConfiguration.addAllowedHeader("*");
    10.  //       创建一个UrlBasedCorsConfigurationSource对象,用于存储基于URL的CORS配置
    11.          UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    12.  //       将CORS配置注册到所有URL模式(/**)。这意味着对于所有请求,都应用这个CORS配置。
    13.          source.registerCorsConfiguration("/**",corsConfiguration);
    14.          return new CorsFilter(source);
    15.     }
    16.  }

    3.创建一个自定义CROS过滤器(实现Filter接口)

     
    
    1. package com.kfm.bisheserve.filter;
    2.  ​
    3.  import javax.servlet.*;
    4.  import javax.servlet.http.HttpServletRequest;
    5.  import javax.servlet.http.HttpServletResponse;
    6.  import java.io.IOException;
    7.  ​
    8.  /**
    9.   * @author 27359
    10.   * date:2024/5/29
    11.   */
    12.  public class CorsFilter implements Filter {
    13.      @Override
    14.      public void init(FilterConfig filterConfig) throws ServletException {
    15.          Filter.super.init(filterConfig);
    16.          // 在这里添加过滤器初始化逻辑(CORS)
    17.     }
    18.  ​
    19.      @Override
    20.      public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    21.  //       HttpServletResponse是ServletResponse接口的一个实现类,专门用于处理HTTP响应
    22.          HttpServletResponse httpResponse = (HttpServletResponse) response;
    23.          //设置CORS响应头
    24.          httpResponse.setHeader("Access-Control-Allow-Origin", "*"); // 允许所有域名访问
    25.          httpResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT"); // 允许的HTTP方法
    26.          httpResponse.setHeader("Access-Control-Max-Age", "3600"); // 预检请求的缓存时间
    27.          httpResponse.setHeader("Access-Control-Allow-Headers", "x-requested-with, authorization, Content-Type, Authorization, credential, X-XSRF-TOKEN"); // 允许的请求头
    28.  ​
    29.          // 如果是预检请求(OPTIONS请求,一般是浏览器自己发送的请求),直接返回成功
    30.          if ("OPTIONS".equalsIgnoreCase(((HttpServletRequest) request).getMethod())) {
    31.              httpResponse.setStatus(HttpServletResponse.SC_OK);
    32.         } else {
    33.              // 如果是其他请求,继续执行过滤器链,chain.doFilter()是Java Servlet API中的方法调用,用于在过滤器链中继续执行下一个过滤器
    34.              chain.doFilter(request, response);
    35.         }
    36.     }
    37.  ​
    38.      @Override
    39.      public void destroy() {
    40.          Filter.super.destroy();
    41.          // 在这里添加过滤器销毁逻辑(如果需要)
    42.     }
    43.  }
     ​

    4.实现WebMvcConfigurer接口,重写addCorsMappings方法

    1.  public class CorsWebMvcConfig implements WebMvcConfigurer {
    2.  //   配置CORS映射
    3.      @Override
    4.      public void addCorsMappings(CorsRegistry registry) {
    5.          registry.addMapping("/**")  //这个映射适用于所有URL模式(/**),表示对于所有请求,都应用这个CORS配置
    6.                 .allowedOriginPatterns("/**")  //这意味着允许所有域名的请求访问你的后端服务。
    7.                 .allowedMethods("*")  //这意味着允许所有类型的HTTP请求(如GET、POST、PUT、DELETE等)。
    8.                 .allowCredentials(true) //这通常与Access-Control-Allow-Origin响应头一起使用,以允许跨域请求携带cookie。
    9.                 .maxAge(3600)  //这意味着浏览器可以缓存预检请求的结果,避免在每次跨域请求时都发送预检请求
    10.                 .allowedHeaders("*"); //这意味着允许所有类型的请求头。
    11.     }
    12.  }

  • 相关阅读:
    贪心算法 —— 字典序删除字符
    python分支结构的花样玩法(二)
    国产低功耗MCU芯片:Si24R03
    Gartner发布当前至2024年的五大隐私趋势
    3D目标检测数据集 KITTI(标签格式解析、点云转图像、点云转BEV)
    11、Service访问Pod、Service IP原理、DNS访问Service、外部访问service
    全球首例:肾衰7年的他移植了一颗猪肾脏
    awk根据某个字段过滤文件航
    iceoryx(冰羚)-通信中间件解析
    用 js 实现判断是否是小数
  • 原文地址:https://blog.csdn.net/qq_53348178/article/details/139281338