一、什么是CORS?

CORS是一个W3C标准,全称是”跨域资源共享”(Cross-origin resource sharing),允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。

它通过服务器增加一个特殊的Header[Access-Control-Allow-Origin]来告诉客户端跨域的限制,如果浏览器支持CORS、并且判断Origin通过的话,就会允许XMLHttpRequest发起跨域请求。

CORS Header

  • Access-Control-Allow-Origin: http://www.xxx.com
  • Access-Control-Max-Age:86400
  • Access-Control-Allow-Methods:GET, POST, OPTIONS, PUT, DELETE
  • Access-Control-Allow-Headers: content-type
  • Access-Control-Allow-Credentials: true

含义解释:

二、SpringBoot跨域请求处理方式

方式一、直接采用SpringBoot的注解@CrossOrigin(也支持SpringMVC)

Controller层在需要跨域的类或者方法上加上该注解即可

实战:

备注说明:Spring 版本必须大于等于4.2

方法二、处理跨域请求的Configuration

增加一个配置类CrossOriginConfig.java。继承WebMvcConfigurerAdapter或者实现WebMvcConfigurer接口

实战:

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;/*** AJAX请求跨域*/
@Configuration
public class CorsConfig extends WebMvcConfigurerAdapter {static final String ORIGINS[] = new String[] { "GET", "POST", "PUT", "DELETE" };@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOrigins("*").allowCredentials(true).allowedMethods(ORIGINS).maxAge(3600);}

方法三、采用过滤器(filter)的方式(推荐)

增加一个CORSFilter 类,并实现Filter接口即可


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.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;/*** * @ClassName:  CorsFilter   * @Description: SpringBoot 跨域处理拦截器*/@Component
public class CROSFilter implements Filter {public static final Logger logger = LoggerFactory.getLogger(CROSFilter.class);@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// TODO Auto-generated method stub}@Overridepublic void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)throws IOException, ServletException {HttpServletResponse response = (HttpServletResponse) res;  HttpServletRequest reqs = (HttpServletRequest) req;  /** 跨域设置允所有请求跨域 * 如果允许指定的客户端跨域设置: http://127.0.0.1:8020*/response.setHeader("Access-Control-Allow-Origin","*");  response.setHeader("Access-Control-Allow-Credentials", "true");  response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");  response.setHeader("Access-Control-Max-Age", "3600");  response.setHeader("Access-Control-Allow-Headers", "Content-Type");  if (((HttpServletRequest) req).getMethod().equals("OPTIONS")) {response.getWriter().println("ok");return;}chain.doFilter(req, res);  }@Overridepublic void destroy() {// TODO Auto-generated method stub}}

解决遇到的错误

1、Request header field content-type is not allowed by Access-Control-Allow-Headers in preflight response.

解决办法:

  response.setHeader("Access-Control-Allow-Headers", "Content-Type");  

2、Response to preflight request doesn't pass access control check: It does not have HTTP ok status.

解决办法:

if (((HttpServletRequest) req).getMethod().equals("OPTIONS")) {response.getWriter().println("ok");return;}

Spring Boot 配置CROS Filter相关推荐

  1. 在Spring boot 配置过滤器(filter)

    在spring boot 配置servlet filter 逻辑上与配置spring 是一样的. 不过相比spring 更加简化配置的难度. 这里只需要两步 1 创建一个自定义顾虑器并继承spring ...

  2. spring boot 配置多个Filter过滤器

    spring boot 配置Filter过滤器 1.通过 @WebFilter 注解来配置filet过滤器 @Component @WebFilter(urlPatterns = "/2/* ...

  3. spring boot配置logback日志

    spring boot配置logback日志 在上一篇spring boot入门里提过,Spring Boot默认的日志打印是logback,所以配置logback日志会很简单,但是也有注意的地方. ...

  4. spring boot配置druid(德鲁伊)

    spring boot配置druid(德鲁伊) 关于druid的介绍请看 阿里巴巴温少访谈 1.引入相关依赖,全部依赖是上一篇spring boot+mybatis依赖的基础上,再加上下边的依赖,如下 ...

  5. spring boot配置详情

    spring boot配置详情如下:  1.MVC相关  mvc  spring.mvc.async.request-timeout设定async请求的超时时间,以毫秒为单位,如果没有设置的话,以具体 ...

  6. Spring Boot 配置元数据指南

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 作者 | 遗失的拂晓 来源 | 公众号「锅外的大佬」 1. 概览 在编写 Spring Bo ...

  7. java多个数据库数据进行访问_通过Spring Boot配置动态数据源访问多个数据库的实现代码...

    之前写过一篇博客<Spring+Mybatis+Mysql搭建分布式数据库访问框架>描述如何通过Spring+Mybatis配置动态数据源访问多个数据库.但是之前的方案有一些限制(原博客中 ...

  8. Spring Boot 配置随机数那些小技巧

    转载自  Spring Boot 配置随机数那些小技巧 Spring Boot支持在系统加载的时候配置随机数. 添加config/random.properties文件,添加以下内容: #随机32位M ...

  9. 19年8月 字母哥 第三章 spring boot 配置原理实战 用热点公司网不行

    第三章 spring boot 配置原理实战 3.1.结合配置加载讲解bean自动装配原理 3.2.详解YAML语法及占位符语法 3.3.获取自定义配置的两种实现方法 3.4.配置文件注入值数据校验 ...

最新文章

  1. 没想到我提前56年感受了赛博朋克
  2. python第七关再来一盘_Python爬虫自学系列(七) — 项目实战篇(一)
  3. python中的引用_Python中的引用
  4. ClickHouse 在字节跳动广告场景的应用
  5. spring boot应用启动原理分析
  6. Python基础教程:为元组中的每一个元素命名
  7. 配置 VIM 英语字典
  8. MyEclipse中导入Spring 4.0源码
  9. jQuery中bind,live,delegate与one方法的用法及区别
  10. https post 报400地址匹配不正确_如何发布领英动态post/article?
  11. linux 如何查看fb中分辨率_Ubuntu: Linux下查看本机显示器分辨率(xrandr)
  12. Java中只存在值传递
  13. java digester_Digester学习笔记(一)
  14. 说说程序员不解风情的瞬间
  15. 微信小程序开通直播的条件
  16. 用例图(use case diagram)
  17. edg击败we视频_LPL夏季赛:EDG零封V5获三连胜 OMG2-1击败WE
  18. DB2性能调整优化问题
  19. 架构 - 单点登录 - Springboot 模拟单点登录
  20. 关于工业线阵相机的一些知识

热门文章

  1. 四大组件之Service(四)-Service的线程、工作线程、权限及系统Service
  2. 软件测试基础知识(二)------------等价类划分法、边界值分析法、场景法、错误推测法、bug定义/类型/优先级/生命周期/跟踪管理
  3. Android6.0 mtk去除原生相机设置中的选项
  4. 如何获取无人机航空摄影测绘成果?
  5. oracle metalink获取,Oracle的MetaLink使用
  6. 目标检测算法的评价指标
  7. JVM 上篇之内存与垃圾回收(个人笔记,勿看)
  8. 什么是segmented control
  9. word删除脚注之后的空白行怎么删除
  10. 漫画:架构师是吧?什么是哈希轮?