当我们需要将spring boot以restful接口的方式对外提供服务的时候,如果此时架构是前后端分离的,那么就会涉及到跨域的问题,那怎么来解决跨域的问题了,下面就来探讨下这个问题。

解决方案一:

在Controller上添加@CrossOrigin注解

使用方式如下:

  1. @CrossOrigin // 注解方式
  2. @RestController
  3. public class HandlerScanController {
  4. @CrossOrigin(allowCredentials="true", allowedHeaders="*", methods={RequestMethod.GET,
  5. RequestMethod.POST, RequestMethod.DELETE, RequestMethod.OPTIONS,
  6. RequestMethod.HEAD, RequestMethod.PUT, RequestMethod.PATCH}, origins="*")
  7. @PostMapping("/confirm")
  8. public Response handler(@RequestBody Request json){
  9. return null;
  10. }

解决方案二:全局配置

代码如下:

  1. @Configuration
  2. public class MyConfiguration {
  3. @Bean
  4. public WebMvcConfigurer corsConfigurer() {
  5. return new WebMvcConfigurerAdapter() {
  6. @Override
  7. public void addCorsMappings(CorsRegistry registry) {
  8. registry.addMapping("/**")
  9. .allowCredentials(true)
  10. .allowedMethods("GET");
  11. }
  12. };
  13. }
  14. }

解决方案三:结合Filter使用
在spring boot的主类中,增加一个CorsFilter

  1. /**
  2. *
  3. * attention:简单跨域就是GET,HEAD和POST请求,但是POST请求的"Content-Type"只能是application/x-www-form-urlencoded, multipart/form-data 或 text/plain
  4. * 反之,就是非简单跨域,此跨域有一个预检机制,说直白点,就是会发两次请求,一次OPTIONS请求,一次真正的请求
  5. */
  6. @Bean
  7. public CorsFilter corsFilter() {
  8. final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
  9. final CorsConfiguration config = new CorsConfiguration();
  10. config.setAllowCredentials(true); // 允许cookies跨域
  11. config.addAllowedOrigin("*");// #允许向该服务器提交请求的URI,*表示全部允许,在SpringMVC中,如果设成*,会自动转成当前请求头中的Origin
  12. config.addAllowedHeader("*");// #允许访问的头信息,*表示全部
  13. config.setMaxAge(18000L);// 预检请求的缓存时间(秒),即在这个时间段里,对于相同的跨域请求不会再预检了
  14. config.addAllowedMethod("OPTIONS");// 允许提交请求的方法,*表示全部允许
  15. config.addAllowedMethod("HEAD");
  16. config.addAllowedMethod("GET");// 允许Get的请求方法
  17. config.addAllowedMethod("PUT");
  18. config.addAllowedMethod("POST");
  19. config.addAllowedMethod("DELETE");
  20. config.addAllowedMethod("PATCH");
  21. source.registerCorsConfiguration("/**", config);
  22. return new CorsFilter(source);
  23. }

当然,如果微服务多的话,需要在每个服务的主类上都加上这么段代码,这违反了DRY原则,更好的做法是在zuul的网关层解决跨域问题,一劳永逸。

spring cloud-前端跨域问题的解决方案的更多相关文章

  1. Spring cloud zuul跨域(一)

    项目背景:我们有web和大屏,以及移动端,需要访问微服务接口. 然而大屏时自己打开的网页,在网页中通过js调用我的webapi.出现了跨域情况. 原因:出现这个问题,是由于跨域请求有2次请求. 第一次 ...

  2. Spring cloud zuul跨域(二)

    使用  CorsFilter  解决ajax跨域问题 直接在zuul的main下面,创建corsFilter就可以了. @SpringBootApplication @EnableZuulProxy ...

  3. Spring Cloud Gateway 跨域 CORS 配置方式实现

    网上找了一堆文章全是说这样写无效 globalcors: cors-configurations: '[/**]': allowCredentials: true allowedOriginPatte ...

  4. 跨域问题,解决方案-Nginx反向代理

    跨域问题,解决之道 跨域问题,在日常开发过程中,是一个非常熟悉的名词.今天的话题,结合我之前的项目场景,讨论下<跨域问题,解决之道>. 跨域是什么 跨域问题,是由于JavaScript出于 ...

  5. Ajax+Spring MVC实现跨域请求(JSONP)JSONP 跨域

    JSONP原理及实现 接下来,来实际模拟一个跨域请求的解决方案.后端为Spring MVC架构的,前端则通过Ajax进行跨域访问. 1.首先客户端需要注册一个callback(服务端通过该callba ...

  6. Ajax+Spring MVC实现跨域请求(JSONP)(转)

    背景: AJAX向后台(springmvc)发送请求,报错:已阻止交叉源请求:同源策略不允许读取 http://127.0.0.1:8080/DevInfoWeb/getJsonp 上的远程资源.可 ...

  7. Ajax+Spring MVC实现跨域请求(JSONP)

    背景: AJAX向后台(springmvc)发送请求,报错:已阻止交叉源请求:同源策略不允许读取 http://127.0.0.1:8080/DevInfoWeb/getJsonp 上的远程资源.可 ...

  8. spring @CrossOrigin解决跨域问题

    阅读目录: 一.跨域(CORS)支持: 二.使用方法: 1.controller配置CORS 2.全局CORS配置 3.XML命名空间 4.How does it work? 5.基于过滤器的CORS ...

  9. 第四节:跨域请求的解决方案和WebApi特有的处理方式

    一. 简介 前言: 跨域问题发生在Javascript发起Ajax调用,其根本原因是因为浏览器对于这种请求,所给予的权限是较低的,通常只允许调用本域中的资源, 除非目标服务器明确地告知它允许跨域调用. ...

随机推荐

  1. directive例子2

    (function() { angular.module('app.widgets') .directive('bsModalPlus', function($window, $sce, $modal ...

  2. JAVA代码时间SFTP文件的下载

    参考文章:http://blog.csdn.net/smallerpig/article/details/50976191 SFTP文件的下载与FTP文件的下载差别较大,需要下载jsch-0.1.54 ...

  3. 20155208徐子涵 2016-2017-2 《Java程序设计》第7周学习总结

    20155208徐子涵 2016-2017-2 <Java程序设计>第7周学习总结 教材学习内容总结 第十三章 时间与日期 13.1 认识时间与日期 就目前来说,即使标注为GMT(无论是文 ...

  4. Chrome程序及数据位置变更到非系统盘

    Chrome浏览器在Windows系统上安装过程,没有设置安装位置的步骤,所以默认是安装在C盘的.并且,若Chrome作为主要浏览器使用,随着时间的积累,数据文件会非常多.增加系统盘的负荷. Wind ...

  5. time,datetime模块

    time & datetime 模块 在平常的代码中,我们常常需要与时间打交道.在Python中,与时间处理有关的模块就包括:time,datetime,calendar(很少用,不讲),下面 ...

  6. hdu1796 How many integers can you find 容斥原理

    Now you get a number N, and a M-integers set, you should find out how many integers which are small ...

  7. Module Sources

    转自:https://www.terraform.io/docs/modules/sources.html 主要记录module source 的格式 The source argument in a ...

  8. .NET本质论 类型基础

    类型概述 类型是CLR程序的生成块(building block). CLR类型(CLR type)是命名的可重用抽象体. CLR类型定义由零个或多个成员(member)组成.类型的成员控制类型如何使 ...

  9. Python高阶函数_map/reduce/filter函数

    本篇将开始介绍python高阶函数map/reduce/filter的用法,更多内容请参考:Python学习指南 map/reduce Python内建了map()和reduce()函数. 如果你读过 ...

  10. python datetime学习

    Python中处理时间的模块datetime, 这个模块里包含的类也叫datetime,所以要使用需要先import from datetime import datetime 获取当前日期和时间 d ...