我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Springboot怎么解决跨域请求问题

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Springboot怎么解决跨域请求问题

这篇文章主要介绍“Springboot怎么解决跨域请求问题”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Springboot怎么解决跨域请求问题”文章能帮助大家解决问题。

1、什么是跨域

由于浏览器同源策略(同源策略,它是由Netscape提出的一个著名的安全策略。现在所有支持JavaScript 的浏览器都会使用这个策略。所谓同源是指,域名,协议,端口相同。),凡是发送请求url的协议、域名、端口三者之间任意一与当前页面地址不同即为跨域。

具体可以查看下表:

Springboot怎么解决跨域请求问题

2、springboot如何解决跨域问题

1.普通跨域请求解决方案:

①请求接口添加注解@CrossOrigin(origins = "http://127.0.0.1:8020", maxAge = 3600)

说明:origins = "http://127.0.0.1:8020" origins值为当前请求该接口的域

②通用配置(所有接口都允许跨域请求)

新增一个configration类 或 在Application中加入CorsFilter和CorsConfiguration方法

@Configuration public class CorsConfig {   private CorsConfiguration buildConfig() {     CorsConfiguration corsConfiguration = new CorsConfiguration();     corsConfiguration.addAllowedOrigin("*"); // 1允许任何域名使用    corsConfiguration.addAllowedHeader("*"); // 2允许任何头    corsConfiguration.addAllowedMethod("*"); // 3允许任何方法(post、get等)     return corsConfiguration;   }   @Bean   public CorsFilter corsFilter() {     UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();     source.registerCorsConfiguration("/**", buildConfig()); // 4     return new CorsFilter(source);   } }

2.ajax自定义headers的跨域请求

$.ajax({    type:"GET",    url:"http://localhost:8766/main/currency/sginInState",    dataType:"JSON",    data:{      uid:userId    },    beforeSend: function (XMLHttpRequest) {      XMLHttpRequest.setRequestHeader("Authorization", access_token);    },    success:function(res){      console.log(res.code)    }  })

此时请求http://localhost:8766/main/currency/sginInState接口发现OPTIONS http://localhost:8766/main/currency/sginInState 500错误,普通跨域的解决方案已经无法解决这种问题,为什么会出现OPTIONS请求呢?

Springboot怎么解决跨域请求问题

原因

浏览器会在发送真正请求之前,先发送一个方法为OPTIONS的预检请求 Preflighted requests 这个请求是用来验证本次请求是否安全的,但是并不是所有请求都会发送,需要符合以下条件:

•请求方法不是GET/HEAD/POST
•POST请求的Content-Type并非application/x-www-form-urlencoded, multipart/form-data, 或text/plain

•请求设置了自定义的header字段

对于管理端的接口,我有对接口进行权限校验,每次请求需要在header中携带自定义的字段(token),所以浏览器会多发送一个OPTIONS请求去验证此次请求的安全性。

为何OPTIONS请求是500呢?

OPTIONS请求只会携带自定义的字段,并不会将相应的值带入进去,而后台校验token字段时 token为NULL,所以验证不通过,抛出了一个异常。

那么我们现在来解决这种问题:

① spring boot项目application.yml中添加

spring:
mvc:
dispatch-options-request: true

注意:这种解决方案可能在某些情况下并不能解决OPTIONS问题,原因可能是环境问题,也可能是复杂的自定义filter过滤器配置问题等。

②添加过滤器配置

手写RequestFilter请求过滤器配置类此类需要实现HandlerInterceptor类,HandlerInterceptor类是org.springframework.web.servlet.HandlerInterceptor下的。

具体代码实现:

@Componentpublic class RequestFilter implements HandlerInterceptor {  public boolean preHandler(HttpServletRequest request,HttpServletResponse response,Object handler){    response.setHeader("Access-Control-Allow-Origin", "*");    response.setHeader("Access-Control-Allow-Credentials", "true");    response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS");    response.setHeader("Access-Control-Max-Age", "86400");    response.setHeader("Access-Control-Allow-Headers", "Authorization");    // 如果是OPTIONS请求则结束    if (HttpMethod.OPTIONS.toString().equals(request.getMethod())) {      response.setStatus(HttpStatus.NO_CONTENT.value());      return false;    }    return true;  }}

手写MyWebConfiguration此类需要继承WebMvcConfigurationSupport。

注意:WebMvcConfigurationSupport是2.x版本以上的,1.x版本为WebMvcConfigurerAdapter 。

具体代码实现:

@Componentpublic class MyWebConfiguration extends WebMvcConfigurationSupport{  @Resource  private RequestFilter requestFilter;  @Override  public void addInterceptors(InterceptorRegistry registry) {    // 跨域拦截器    registry.addInterceptor(requestFilter).addPathPatterns("/**");  }}

关于“Springboot怎么解决跨域请求问题”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Springboot怎么解决跨域请求问题

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Springboot怎么解决跨域请求问题

这篇文章主要介绍“Springboot怎么解决跨域请求问题”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Springboot怎么解决跨域请求问题”文章能帮助大家解决问题。1、什么是跨域由于浏览器同源
2023-07-06

Django解决跨域请求的问题

一、引入  对于想要利用django框架实现前后端分离的童鞋来说,首要的问题便是解决跨域请求的问题。何为跨域请求?简单来说,就是当前发起的请求的域与该请求指向的资源所在的域不一致。当协议+域名+端口号均相同,那么就是同一个域。举个例子,ht
2023-01-30

jsonp和CORS跨域请求问题怎么解决

这篇文章主要讲解了“jsonp和CORS跨域请求问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“jsonp和CORS跨域请求问题怎么解决”吧!JSONPjsonp 的原理很简单,利
2023-06-02

如何解决Ajax请求跨域问题

这期内容当中小编将会给大家带来有关如何解决Ajax请求跨域问题,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、解决方案:1,在服务器端的响应头中添加一个http参数:res.setHeader("Acc
2023-06-08

springboot怎么解决跨域问题

在Spring Boot中解决跨域问题可以通过以下几种方式:使用注解@EnableWebMvc和@CrossOrigin:在Spring Boot的启动类上添加@EnableWebMvc注解,并在Controller的方法上添加@Cross
2023-10-25

怎么解决SpringBoot跨域问题

这篇文章给大家分享的是有关怎么解决SpringBoot跨域问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。允许全部请求跨域许可的代码需要继承WebMvcConfigurerAdapter类。@Configura
2023-06-28

SpringBoot中的跨域问题怎么解决

本篇内容主要讲解“SpringBoot中的跨域问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot中的跨域问题怎么解决”吧!1、跨域访问报错当一个请求url的协议、域名
2023-06-29

快速解决跨域请求问题:jsonp和CORS

网上各种跨域教程,各种实践,各种问答,除了简单的 jsonp 以外,很多说 CORS 的都是行不通的,老是缺那么一两个关键的配置。本文只想解决问题,所有的代码经过亲自实践。本文解决跨域中的 get、post、data、cookie 等这些问
2023-05-30

springboot跨域问题带来的BUG怎么解决

这篇文章主要介绍了springboot跨域问题带来的BUG怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇springboot跨域问题带来的BUG怎么解决文章都会有所收获,下面我们一起来看看吧。需求前端用
2023-06-27

Springboot中怎么处理CORS跨域请求

Springboot中怎么处理CORS跨域请求,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。  一、什么是CROS?  CORS Header  二、SpringBoot跨域请
2023-06-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录