springboot解决跨域问题

news2024/12/29 9:04:43

springboot解决跨域问题

文章目录

  • springboot解决跨域问题
  • 一、跨域是什么?
  • 二、java解决CORS请求的方式
    • 1.返回新的CORSFilter(全局跨域)
    • 2.重写WebMvcConfigurer(全局跨域)
    • 3.使用注解CorsOrigin
    • 4.手动设置响应头(局部跨域)
    • 5.自定义filter实现跨域


一、跨域是什么?

跨域 :是指浏览器不能执行其他网站的脚本。它是由于浏览器的同源策略引起的,是浏览器对javascript施加的安全策略。
例如: a页面想获取b页面资源,如果a,b页面的协议,域名,端口号及其子域名不同,那么所进行的访问行动都是跨域的,而浏览器为了安全问题一般都限制了访问,也就是不允许跨域请求资源。跨域访问限制,其实就是浏览器的限制!!

同源策略,是指协议,域名,端口号及其子端口号都要相同,其中一个不同就会产生跨域。
在这里插入图片描述

二、java解决CORS请求的方式

对于CORS的跨域请求,主要以下几种方式可以选择。

1、返回新的CORSFilter
2、重写WebMvcConfigurer
3、使用注解CrossOrigin
4、手动设置响应头(HttpServletResponse)
5、自定义WebFiler实现跨域

1.返回新的CORSFilter(全局跨域)

在任意配置类,返回一个新的CorsFilter Bean,并添加映射路径和就具体的CORS配置路径

@Configuration
public class GlobalCorsConfig {

    @Bean
    public CorsFilter corsFilter() {
        //1. 添加 CORS配置信息
        CorsConfiguration config = new CorsConfiguration();
        //放行哪些原始域
        config.addAllowedOrigin("*");
        //是否发送 Cookie
        config.setAllowCredentials(true);
        //放行哪些请求方式
        config.addAllowedMethod("*");
        //放行哪些原始请求头部信息
        config.addAllowedHeader("*");
        //暴露哪些头部信息
        config.addExposedHeader("*");
        //2. 添加映射路径
        UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource();
        corsConfigurationSource.registerCorsConfiguration("/**",config);
        //3. 返回新的CorsFilter
        return new CorsFilter(corsConfigurationSource);
    }
}

2.重写WebMvcConfigurer(全局跨域)

@Configuration
public class CorsConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                //是否发送Cookie
                .allowCredentials(true)
                //放行哪些原始域
                .allowedOrigins("*")
                .allowedMethods(new String[]{"GET", "POST", "PUT", "DELETE"})
                .allowedHeaders("*")
                .exposedHeaders("*");
    }
}

3.使用注解CorsOrigin

在控制类上表示该类的所有方法允许跨域

@RestController
@CrossOrigin(origins = "*")
public class HelloController {

    @RequestMapping("/hello")
    public String hello() {
        return "hello world";
    }
}

在方法上使用CorsOrigin注解

  @RequestMapping("/hello")
  @CrossOrigin(origins = "*")
   //@CrossOrigin(value = "http://localhost:8081") //指定具体ip允许跨域
  public String hello() {
        return "hello world";
  }

4.手动设置响应头(局部跨域)

使用HttpServletResponse对象添加响应头(Access-Control-Allow-Origin)来授权原始域,这里 Origin的值也可以设置为 “*”,表示全部放行。

@RequestMapping("/index")
public String index(HttpServletResponse response) {

    response.addHeader("Access-Allow-Control-Origin","*");
    return "index";
}

5.自定义filter实现跨域

package cn.wideth.aop;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;

@Component
public class MyCorsFilter 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-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "x-requested-with,content-type");
    chain.doFilter(req, res);
    
  }
  
  public void init(FilterConfig filterConfig) {}
  public void destroy() {}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/65426.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何安装Ambari集群_大数据培训

注意:以下操作主节点操作即可 1 制作本地源 制作本地源是因为在线安装Ambari太慢。制作本地源只需在主节点上进行。 1.1 配置HTTPD 服务 配置HTTPD 服务到系统层使其随系统自动启动 [roothadoop102 ~]# chkconfig httpd on [roothadoop102 ~]# service httpd …

[附源码]Python计算机毕业设计Django网上电影购票系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

股票量化分析工具QTYX使用攻略——均线系统多头排列选股

搭建自己的量化系统如果要长期在市场中立于不败之地!必须要形成一套自己的交易系统。如何学会搭建自己的量化交易系统?边学习边实战,在实战中学习才是最有效地方式。于是我们分享一个即可以用于学习,也可以用于实战炒股分析的量化…

【软件测试】软件测试工程师职位核心任务?测试人测试职业发展?

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 你认为软件测试工程…

RDMA测试集:preftest安装与使用

RDMA测试集:preftest安装与使用 perftest是一组基于uverbs编写的测试程序,是RDMA性能相关的benchmark。可用于软硬件调优以及功能测试。 源码位置 linux-rdma/perftest: Infiniband Verbs Performance Tests (github.com) perftest测试软件包含的测试…

111个Python数据分析实战项目,代码已跑通,数据可下载

写在前面: 这里整理了111个数据分析的案例,每一个都进行了严格的筛选,筛选标准如下: 1. 有干货:杜绝纯可视化、统计性分析,有一定比例的讲解性文字 2. 可跑通:所有代码均经过测试,…

框架的优点(SpringBoot VS Servlet)

创建项目比较: 创建Servlet项目:流程复杂,容易出错,这里可以参考之前写的一篇博客: 如何创建一个Servlet项目(Maven)?_crazy_xieyi的博客-CSDN博客_maven创建servlet 1.创建maven…

【JavaSE】HashMap底层原理、面试题详解

【JavaSE】HashMap底层原理、面试题详解 文章目录【JavaSE】HashMap底层原理、面试题详解一:HashMap的数据结构1:JDK1.72:JDK1.8二:hash 方法的原理三:HashMap的put流程四:HashMap的get流程五:H…

ARM基础(2):模式和特权等级(User/Thread mode和Privileged level)

Cortex-M3处理器支持两种模式和两种特权级别。 如下图所示,当处理器运行于Thread mode时,它可以处于Privileged或User级别;而Handler mode下,只能处于Privileged级别。当处理器复位完毕后,处于Thread mode。 在User级…

SSM(spring+springmvc+mybatis)完全注解开发整合

SSM(springspringmvcmybatis)完全注解开发整合 目录结构如图: 创建数据库 create database mydb; use mydb; create table tbl_users(id int primary key auto_increment,username varchar(20),password varchar(20),age int,birthday date );insert tbl_users(…

[Cortex-M3]-4-如何在内嵌RAM中运行程序

[Cortex-M3]-1-启动流程-启动文件[Cortex-M3]-2-map文件解析[Cortex-M3]-3-分散加载文件解析(.sct)[Cortex-M3]-4-如何在内嵌RAM中运行程序 1 定义items 在进行项目开发时,可以在project items中创建debug和release,并确定。 平时调试下拉选…

web结课作业的源码——HTML+CSS+JavaScript仿oppo官网手机商城(1页)

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…

15、简单了解Vue

1、vue概述 Vue是一套前端框架,可以免除原生JavaScript中的DOM操作,简化书写。 基于MVVM(Model-View-View Model)思想,实现数据的双向绑定,将编程的关注点放在数据上 vue的官网:https://cn.v…

电脑数据转移到新电脑?换新电脑如何转移软件

电脑数据转移到新电脑?许多用户在下载游戏的时候,没有更改默认安装位置,直接把游戏安装到了C盘里,结果导致C盘空间不足,于是希望将游戏移动到其他驱动器以释放空间。也有的用户是更换了电脑,不想重新安装游…

常用数据库之sqlite的使用

2.1 介绍 sqlite为关系型数据库,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它的设计目标是嵌入式的,而且已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌…

反序列化__wakeup

简介 __wakeup()&#xff0c;执行unserialize()时&#xff0c;先会调用这个函数。 <?php class c1 {private $argv;private $method;function __construct($argv,$method){$this->argv$argv;$this->method$method;}public function f1(){ech…

BUG系列路径规划算法原理介绍(六)——BugFlood算法

本系列文章主要对Bug类路径规划算法的原理进行介绍&#xff0c;在本系列的第一篇文章中按照时间顺序梳理了自1986年至2018年Bug类路径规划算法的发展&#xff0c;整理了13种BUG系列中的典型算法&#xff0c;从本系列的第二篇文章开始依次详细介绍了其中具有代表性的BUG1、BUG2、…

KubeSphere开启DevOps 功能教程

基于 Jenkins 的 KubeSphere DevOps 系统是专为 Kubernetes 中的 CI/CD 工作流设计的&#xff0c;它提供了一站式的解决方案&#xff0c;帮助开发和运维团队用非常简单的方式构建、测试和发布应用到 Kubernetes。它还具有插件管理、Binary-to-Image (B2I)、Source-to-Image (S2…

MySQL遵循最左前缀匹配原则!面试官:回去等通知吧

我们都知道&#xff0c;MySQL的Innodb引擎中&#xff0c;索引是通过B树来实现的。不管是普通索引还是联合索引&#xff0c;都需要构造一个B树的索引结构。 那么&#xff0c;我们都知道普通索引的存储结构中在B树的每个非节点上记录的索引的值&#xff0c;而这棵B树的叶子节点上…

Markdown官方教程(六)

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…