SpringBoot跨域配置「建议收藏」

SpringBoot跨域配置「建议收藏」什么是跨域简单而言,跨域请求就是当一台服务器资源从另一台服务器(不同的域名或者端口)请求一个资源或者接口,就会发起一个跨域HTTP请求。举个简单的例子,从http://www.baidu.com,发送一个Ajax请求,请求地址是http://www.taobao.com下面的一个接口,这就是发起了一个跨域请求,在不做任何处理的情况下,显然当前跨域请求是无法被成功请求,因为浏览器基于同源策略会对跨域请求做一定的限制。产生跨域问题的条件例如:http://192.168.38.438:808

大家好,又见面了,我是你们的朋友全栈君。

什么是跨域

简单而言,跨域请求就是当一台服务器资源从另一台服务器(不同 的域名或者端口)请求一个资源或者接口,就会发起一个跨域 HTTP 请求。举个简单的例子,从http://www.baidu.com,发送一个 Ajax 请求,请求地址是 http://www.taobao.com下面的一个接口,这就是发起了一个跨域请求,在不做任何处理的情况下,显然当前跨域请求是无法被成功请求,因为浏览器基于同源策略会对跨域请求做一定的限制。

产生跨域问题的条件

例如: http://192.168.38.438:8080
当协议、IP、端口三部分中有任意一个不同时,即为跨域

后端结局方案

  • nginx反向代理解决跨域
  • 服务端设置Response Header(响应头部)的Access-Control-Allow-Origin
  • 在需要跨域访问的类和方法中设置允许跨域访问(如Spring中使用@CrossOrigin注解);
  • 继承使用Spring Web的CorsFilter(适用于Spring MVC、Spring Boot)
  • 实现WebMvcConfigurer接口(适用于Spring Boot)

一、使用Filter方式进行设置

使用Filter过滤器来过滤服务请求,向请求端设置Response Header(响应头部)的Access-Control-Allow-Origin属性声明允许跨域访问。

@WebFilter
public class CorsFilter implements Filter { 
     

    @Override
    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", "*");  
        response.setHeader("Access-Control-Max-Age", "3600");  
        response.setHeader("Access-Control-Allow-Headers", "*");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        chain.doFilter(req, res);  
    }  
}

或者

package com.wk.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

@Configuration
public class CorsConfig { 
   

    // 当前跨域请求最大有效时长。这里默认1天
    private static final long MAX_AGE = 24 * 60 * 60;

    @Bean
    public CorsFilter corsFilter() { 
   
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedOrigin("*"); // 1 设置访问源地址
        corsConfiguration.addAllowedHeader("*"); // 2 设置访问源请求头
        corsConfiguration.addAllowedMethod("*"); // 3 设置访问源请求方法
        corsConfiguration.setMaxAge(MAX_AGE);
        source.registerCorsConfiguration("/**", corsConfiguration); // 4 对接口配置跨域设置
        return new CorsFilter(source);
    }
}

二、继承 HandlerInterceptorAdapter

@Component
public class CrossInterceptor extends HandlerInterceptorAdapter { 
   

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
   
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "*");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        return true;
    }
}

三、实现 WebMvcConfigurer

@Configuration
@SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection")
public class AppConfig implements WebMvcConfigurer { 
   

    @Override
    public void addCorsMappings(CorsRegistry registry) { 
   
        registry.addMapping("/**")  // 拦截所有的请求
                .allowedOrigins("http://www.abc.com")  // 可跨域的域名,可以为 *
                .allowCredentials(true)
                .allowedMethods("*")   // 允许跨域的方法,可以单独配置
                .allowedHeaders("*");  // 允许跨域的请求头,可以单独配置
    }
}

四、使用Nginx配置

location / { 
   
   add_header Access-Control-Allow-Origin *;
   add_header Access-Control-Allow-Headers X-Requested-With;
   add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;

   if ($request_method = 'OPTIONS') { 
   
     return 204;
   }
}

参考

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/148939.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • CentOS 7系统离线安装gcc,gcc-c++,让你摆脱联网装不了的困惑!

    CentOS 7系统离线安装gcc,gcc-c++,让你摆脱联网装不了的困惑!我的就是CentOs7系统,需要装一个Nginx服务器的时候,死活都装不上运行环境gcc,gcc-c++,一直纠结了几天,后来我睡觉的时候突然一个灵感来了,就继续查资料,如果缺少依赖包,那么就去装依赖包,手动安装或者离线安装都可以。第二天上班的时候我就开始查网上查资料,果然有这种解决办法,并且还有各个依赖包都抽离出来了,感谢各位大佬的分享,我写这个不是为了宣传什么,…

    2022年5月9日
    40
  • 软件工程之软件过程模型[通俗易懂]

    软件工程之软件过程模型[通俗易懂]软件过程模型软件过程模型习惯上也称为软件开发模型,它是软件开发全部过程、活动和任务的结构框架。瀑布模型:瀑布模型是将软件生存周期中的各个活动规定为依线性连接的若干阶段的模型,包括需求分析、设计、编码、测试、运行与维护。由前至后、相互衔接的固定次序,如同瀑布流水逐级下落。瀑布模型是以文档作为驱动、适合于软件需求很明确的软件项目的模型。V模型V模型是瀑布模型的一个变体。V模型提供了

    2025年6月23日
    4
  • ubuntu安装vscode的两种方法

    ubuntu安装vscode的两种方法方法一:依次输入如下命令1、sudoadd-apt-repositoryppa:ubuntu-desktop/ubuntu-make2、sudoapt-getupdate3、sudoapt-getinstallubuntu-make4、umakeidevisual-studio-code提示输入a即可方法二:在windows系统下载安装包,再使用共享文件夹…

    2022年9月18日
    5
  • Mysql 实现多种逻辑删除方案

    Mysql 实现多种逻辑删除方案Mysql实现多种逻辑删除方案新增逻辑删除字段方式多deleted值deleted:0代表未删除,删除时把deleted赋值为时间戳UNIX_TIMESTAMP(NOW())采用备份表方式最近在做公司项目的时候,对于表的逻辑删除,和其他同事出现了不同意见,故查阅了一些blog,结合自己的实际情况,再次做了笔记,以备后查。在实际的项目开发中,对于某些业务数据,一般都不会采用物理删除的方式,…

    2022年5月5日
    188
  • EJB学习笔记一(EJB概述)

    EJB学习笔记一(EJB概述)1.前言从今天开始,简单的学习一下有关EJB方面的知识.从自己看EJB有关方面的书籍来看,感觉跟市面上的Spring很像,后来才发现,整个Spring框架实际上是参考了EJB的设计理念,由于学习过Spring,所以现在学习EJB的相关知识,并不是很吃力.接下来会在几篇博客中,简单的书写一下,自己的EJB的认识. 2.什么是EJBEJB全名为EnterpriseJa

    2022年9月30日
    2
  • java 开源 视频会议_Openmeetings 开源视频会议系统介绍与部署

    java 开源 视频会议_Openmeetings 开源视频会议系统介绍与部署Openmeetings当前作为Apache下的一个项目,基于JAVA开发,主要用于提供视频会议、即时通讯、白板、协作文档等群件工具,通过使用Red5流媒体服务器处理媒体流。Openmeetings的主要功能和特性:音频、视频会议会议前可选择音频、视频、音频+视频、图像四种模式。如图示:2.会议记录和屏幕共享3.文件管理,可以自己创建目录结构4.主持人权限控制,可以控制用户”成为主持人”…

    2022年7月12日
    24

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号