本文来说下SpringBoot中实现跨域的5种方式。

文章目录

  • 什么是跨域
  • java解决CORS跨域请求的方式
    • 返回新的CorsFilter(全局跨域)
    • 重写WebMvcConfigurer(全局跨域)
    • 使用注解 (局部跨域)
    • 手动设置响应头(局部跨域)
    • 使用自定义filter实现跨域
  • 本文小结

什么是跨域

跨域:指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。

例如:a页面想获取b页面资源,如果a、b页面的协议、域名、端口、子域名不同,所进行的访问行动都是跨域的,而浏览器为了安全问题一般都限制了跨域访问,也就是不允许跨域请求资源。注意:跨域限制访问,其实是浏览器的限制。理解这一点很重要!!!

同源策略是指协议,域名,端口都要相同,其中有一个不同都会产生跨域


java解决CORS跨域请求的方式

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

  1. 返回新的CorsFilter
  2. 重写 WebMvcConfigurer
  3. 使用注解 @CrossOrigin
  4. 手动设置响应头 (HttpServletResponse)
  5. 自定web filter 实现跨域

注意:

  • CorFilter / WebMvConfigurer / @CrossOrigin 需要 SpringMVC 4.2以上版本才支持,对应springBoot 1.3版本以上。
  • 上面前两种方式属于全局 CORS 配置,后两种属于局部 CORS配置。如果使用了局部跨域是会覆盖全局跨域的规则,所以可以通过 @CrossOrigin 注解来进行细粒度更高的跨域资源控制。
  • 其实无论哪种方案,最终目的都是修改响应头,向响应头中添加浏览器所要求的数据,进而实现跨域。

返回新的CorsFilter(全局跨域)

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

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

重写WebMvcConfigurer(全局跨域)

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

使用注解 (局部跨域)

在控制器(类上)上使用注解 @CrossOrigin:,表示该类的所有方法允许跨域

@RestController
@CrossOrigin(origins = "*")
public class HelloController {@RequestMapping("/hello")public String hello() {return "hello world";}
}

在方法上使用注解 @CrossOrigin:

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

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

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

@RequestMapping("/index")
public String index(HttpServletResponse response) {response.addHeader("Access-Allow-Control-Origin","*");return "index";
}

使用自定义filter实现跨域

首先编写一个过滤器,可以起名字为MyCorsFilter.java

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() {}
}

本文小结

本文介绍了SpringBoot解决跨域的5种方式,本人使用最多的是第三种。

SpringBoot解决跨域的5种方式相关推荐

  1. Springboot 解决跨域的四种姿势

    Springboot 解决跨域的四种姿势 姿势一 实现WebMvcConfigurer#addCorsMappings的方法 import org.springframework.context.an ...

  2. 什么是同源策略及解决跨域的三种方式

    同源策略 1.1.1 所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个 ip 地址,也非同源.同源策略/SOP(Same origin policy)是一种约 ...

  3. springboot项目解决跨域的几种方式

    跨域资源共享(CORS):通过修改Http协议header的方式,实现跨域.说的简单点就是,通过设置HTTP的响应头信息,告知浏览器哪些情况在不符合同源策略的条件下也可以跨域访问,浏览器通过解析Htt ...

  4. SpringBoot解决跨域问题的六种方式

    一.同源策略 同源,就是咱们域名.端口号.ip.采用的协议都相同,那么我们就是同源的 反之就是不同源的!!! 出于浏览器的同源策略限制.同源策略(Sameoriginpolicy)是一种约定,它是浏览 ...

  5. 前端实现跨域的三种方式

    前端解决跨域的三种方式: 1.cors跨域(只需要后端配置) header("Access-Control-Allow-Origin:*"); // 允许任何来源 header(& ...

  6. 只有ajax会跨域吗_ajax处理跨域有几种方式

    jQuery 使用 JSONP 缺点: 1.这种方式无法发送post请求(这里) 2.另外要确定jsonp的请求是否失败并不容易,大多数框架的实现都是结合超时时间来判定. 跨域的几种方式 在项目中可能 ...

  7. vue开发环境和生产环境里面解决跨域的几种方法

    vue开发环境和生产环境里面解决跨域的几种方法 参考文章: (1)vue开发环境和生产环境里面解决跨域的几种方法 (2)https://www.cnblogs.com/pass245939319/p/ ...

  8. springboot解决跨域问题(Cors)

    springboot解决跨域问题(Cors) 参考文章: (1)springboot解决跨域问题(Cors) (2)https://www.cnblogs.com/owenma/p/8466856.h ...

  9. SpringBoot解决跨域(CROS)问题

    SpringBoot解决跨域问题(CROS) 问题: 前端请求后端出现下图类似问题: Access to fetch at 'http://localhost:8081/user/page?pageN ...

最新文章

  1. 【机器视觉案例】(6) AI视觉,距离测量,自制AI小游戏,附python完整代码
  2. Rectangle Area
  3. iOS9的几个新关键字(nonnull、nullable、null_resettable、__null_unspecified)
  4. ef mysql dbfirst,.NetCore教程之 EFCore連接Mysql DBFirst模式
  5. 移动开发js库Zepto.js使用中的一些注意点
  6. “杀死” APP 的留白设计!
  7. 有长度要求的区间最大值
  8. 关于python map代码理解实例
  9. 2021年3月计算机语言排名,2021年3月编程语言排行榜:TOIBE将迎来重大改变,SQL如愿挤进前十...
  10. MCPC 2011Hdu4207-4214(未完全)题解
  11. 【雷达通信】基于matlab CDIF算法雷达信号分选【含Matlab源码 1186期】
  12. 基于Matlab的SLIC超像素分割算法分析
  13. 电气能插本计算机类吗,2019年专插本电气工程及自动化专业介绍
  14. 想要一款iOS矢量绘图编程软件?推荐来了
  15. 环洋市场调研-2021年全球Camlock联轴器行业调研及趋势分析报告
  16. 无法删除文件无法读源文件或磁盘的解决办法
  17. RestTemplate设置Headers
  18. java基于ssm房屋出售租赁管理系统
  19. 喜羊羊与灰太狼java_喜羊羊与灰太狼之懒洋洋风波
  20. 【网上商城优惠活动】

热门文章

  1. 在opencv中实现中文输出
  2. 用C#完成Swift远程推送通知
  3. DOM(二)使用DOM
  4. 阻止SPY++类似的程序捕捉软件窗口
  5. In和exists使用及性能分析(一):in的使用
  6. 20145209 《信息安全系统设计基础》第14周学习总结
  7. 虚拟机无法联网解决方法
  8. Java集合系列:Vector解析
  9. RabbitMQ(六) Routing路由模式
  10. Arrays.asList()的坑