SpringBoot如何配置CROS Filter

 更新时间:2023年12月12日 08:37:14   作者:在奋斗的大道  
这篇文章主要介绍了SpringBoot如何配置CROS Filter问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

一、什么是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" };
    @Override
    public 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);
	
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
		
	}
 
	@Override
	public 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);  
	}
 
	@Override
	public 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;
        }

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • PostMan post请求发送Json数据的方法

    PostMan post请求发送Json数据的方法

    下面小编就为大家分享一篇PostMan post请求发送Json数据的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • SpringCloud消息总线Bus配置中心实现过程解析

    SpringCloud消息总线Bus配置中心实现过程解析

    这篇文章主要介绍了SpringCloud消息总线Bus配置中心实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 解读yml文件中配置时间类型的转换方式

    解读yml文件中配置时间类型的转换方式

    这篇文章主要介绍了yml文件中配置时间类型的转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Java中使用阻塞队列控制线程集实例

    Java中使用阻塞队列控制线程集实例

    这篇文章主要介绍了Java控制阻塞队列线程集实例,本文用一个程序展示了如何使用阻塞队列来控制线程集,程序功能是在一个目录及它的所有子目录下搜索所有文件,打印出包含指定关键字的文件列表,需要的朋友可以参考下
    2015-01-01
  • 解析Spring 漏洞及其修复方案

    解析Spring 漏洞及其修复方案

    官宣了最近网传的Spring漏洞。攻击者利用该漏洞,可在未授权的情况下远程执行命令,今天通过本文给大家普及下漏洞分析影响范围及解决方案,感兴趣的朋友跟随小编一起看看吧
    2022-04-04
  • Java Stream中自定义Collector实现复杂数据收集的方法

    Java Stream中自定义Collector实现复杂数据收集的方法

    Java Stream API中的Collector接口是一个强大的工具,它允许我们自定义数据收集、转换和聚合的过程,,本文介绍了Java Stream中自定义Collector实现复杂数据收集方法,需要的朋友可以参考下
    2024-08-08
  • springboot图片验证码功能模块

    springboot图片验证码功能模块

    用户登录几乎是一个线上系统必不可少且使用相对比较频繁的一个模块,为了防止恶意暴力尝试,防止洪水攻击、防止脚本自动提交等,验证码是一个较为便捷且行之有效的预防手段,这篇文章主要介绍了springboot图片验证码功能模块,需要的朋友可以参考下
    2022-04-04
  • Java虚拟机JVM栈溢出的问题解决

    Java虚拟机JVM栈溢出的问题解决

    Java虚拟机栈溢出是指在Java程序中,当线程调用的方法层级过深,导致栈空间溢出的情况,本文就详细的介绍了下产生的原因以及优化,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • java ArrayBlockingQueue阻塞队列的实现示例

    java ArrayBlockingQueue阻塞队列的实现示例

    ArrayBlockingQueue是一个基于数组实现的阻塞队列,本文就来介绍一下java ArrayBlockingQueue阻塞队列的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • java实现对excel文件的处理合并单元格的操作

    java实现对excel文件的处理合并单元格的操作

    这篇文章主要介绍了java实现对excel文件的处理合并单元格的操作,开头给大家介绍了依赖引入代码,表格操作的核心代码,代码超级简单,需要的朋友可以参考下
    2021-07-07

最新评论