Spring Boot跨域处理

2年前 (2022) 程序员胖胖胖虎阿
114 0 0

✨ Spring Boot跨域处理

  • 跨域处理
    • 跨域问题演示
    • 跨域概述
    • 解决方法
      • 在方法上使用@CrossOrigin
      • 自定义全局配置类
      • 自定义跨域过滤器


📃个人主页:不断前进的皮卡丘


🌞博客描述:梦想也许遥不可及,但重要的是追梦的过程,用博客记录自己的成长,记录自己一步一步向上攀登的印记


🔥系列专栏:Spring Boot系列专栏

跨域处理

跨域问题演示

我们先来演示一下跨域问题,后端代码参照上一篇博客
Spring Boot跨域处理
Spring Boot跨域处理
如果在前端想要获取班级的数据,就应该给后端发送一个get请求
Spring Boot跨域处理
但是我们可以发现出错了
Spring Boot跨域处理

跨域概述

  • 跨域问题:在前后端分离开发过程中,前后端程序独立部署在不同的服务器,默认是拒绝跨域的
  • 跨域问题产生原因:在设计HTTP协议的时候,为了保证数据的安全,定义了同源同策规则,就比如我们的qq不能发消息给微信一样,所以不允许跨域访问
  • 跨域问题的解决方案:
    • 后端处理
    • 前端处理
    • 中间反向代理服务器

什么是跨域,跨域解决方案

讲跨域的话,那我们就得了解一下同源策略。同源策略是由Netscape提出的一个著名的安全策略,它是浏览器最核心也是最基本的安全功能,现在所有支持JavaScript的浏览器都会使用这个策略。
同源是指协议、域名、端口要相同。同源策略是基于安全方面的考虑提出了的,这个策略本身是没有问题的,但是我们在实际开发中,因为各种原因又经常会有跨域的需求,传统的跨域方案是JSONP,JSONP虽然可以解决跨域,但是有一个很大的局限性,那就是它只支持GET请求,不支持其他类型的请求

本篇文章要说的是CORS(Cross-origin resource sharing,跨域源资源共享),是一个W3C标准,它是一份浏览器技术的规范,提供了Web服务从不同网域传来沙盒脚本的方法,以避开浏览器的同源策略,这是JSONP模式的现代版,在Spring框架中,对于CORS也提供了相应的解决方案。

解决方法

在方法上使用@CrossOrigin

 /**
     * 查询所有班级信息
     */
    @GetMapping("/school/cls")
    //所有的客户端请求都运行
    //@CrossOrigin
    //参数:限制前端跨域的地址
    @CrossOrigin(value = "http://localhost:8848")
    public ResultInfo queryAllCls() {
        ResultInfo info = new ResultInfo();
        try {
            List<Cls> clsList = clsService.queryAllCls();
            info.setCode(200);
            info.setOk();
            info.setData(clsList);

        } catch (Exception e) {
            e.printStackTrace();
            info.setError();

        }
        return info;
    }

Spring Boot跨域处理

自定义全局配置类

这种方式不适合带请求头的方式

/**
 * @author zengyihong
 * @create 2022--08--16 17:56
 */
@Configuration
public class WebConfig implements WebMvcConfigurer {
    /**
     * addMapping:允许哪一些资源路径被跨域
     * allowedOrigins:允许哪些资源被跨域
     * allowedMethods:允许哪些请求方式被跨域
     * allowCredentials:是否使用缓存机制
     * maxAge:跨域请求的超时时间
     * @param registry
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {

         registry.addMapping("/**")
                 .allowedOrigins("*")
//                 .allowedOrigins("http://localhost:8080","http://localhost:88848")
                 .allowedMethods("*")
//                 .allowedMethods("GET","POST","DELETE","PUT")
                 .allowCredentials(false)
                 .maxAge(3600);
    }
}
 

自定义跨域过滤器

package com.zyh.springboot.config;


import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

/**
 * @author zengyihong
 * @create 2022--08--16 19:04
 */
@Configuration
public class CustomCorsFilter {
    @Bean
    public FilterRegistrationBean corsFilter(){
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(false);//表示是否允许请求带有验证信息
        config.addAllowedOrigin("*");//表示允许所有,可以设置需要的地址
        config.addAllowedHeader("*");
        config.addAllowedMethod("*");
        source.registerCorsConfiguration("/**", config);//CORS配置对所有接口都有效
        FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
        bean.setOrder(3600);
        return bean;





    }
}

Spring Boot跨域处理

版权声明:程序员胖胖胖虎阿 发表于 2022年9月6日 下午1:24。
转载请注明:Spring Boot跨域处理 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...