首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java - Spring Boot: Access-Control- Allow-Origin不工作

基础概念

Access-Control-Allow-Origin 是一个 HTTP 响应头,用于控制跨域资源共享(CORS)。当浏览器发起跨域请求时,会检查服务器返回的响应头中是否包含 Access-Control-Allow-Origin,如果包含且值允许当前请求的源,则请求可以成功通过。

相关优势

  1. 安全性:通过控制哪些源可以访问资源,可以有效防止跨站请求伪造(CSRF)等安全问题。
  2. 灵活性:可以根据不同的需求设置不同的源,实现精细化的访问控制。

类型

Access-Control-Allow-Origin 可以有以下几种常见的值:

  • *:表示允许所有源访问。
  • 具体域名:例如 http://example.com,表示只允许该域名访问。
  • 多个域名:例如 http://example1.com, http://example2.com,表示允许这些域名访问。

应用场景

在 Web 开发中,当需要在前端页面中通过 AJAX 请求访问不同源的后端 API 时,就需要使用 CORS 来解决跨域问题。

问题及解决方法

问题:Access-Control-Allow-Origin 不工作

原因

  1. 配置错误:可能是在 Spring Boot 中没有正确配置 CORS。
  2. 预检请求未处理:对于某些复杂的跨域请求(如带有自定义头的请求),浏览器会先发送一个预检请求(OPTIONS 请求),如果服务器没有正确处理这个预检请求,实际请求将不会被允许。
  3. 其他中间件干扰:可能存在其他中间件或过滤器干扰了 CORS 配置。

解决方法

以下是一个在 Spring Boot 中配置 CORS 的示例:

代码语言:txt
复制
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class CorsConfig {

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**")
                        .allowedOrigins("http://example.com")
                        .allowedMethods("GET", "POST", "PUT", "DELETE")
                        .allowedHeaders("*")
                        .allowCredentials(true)
                        .maxAge(3600);
            }
        };
    }
}

在这个示例中:

  • addMapping("/**") 表示对所有路径启用 CORS。
  • allowedOrigins("http://example.com") 表示只允许 http://example.com 访问。
  • allowedMethods("GET", "POST", "PUT", "DELETE") 表示允许的 HTTP 方法。
  • allowedHeaders("*") 表示允许所有请求头。
  • allowCredentials(true) 表示允许发送 Cookie。
  • maxAge(3600) 表示预检请求的缓存时间。

处理预检请求

确保服务器能够正确处理 OPTIONS 请求。Spring Boot 默认会处理 OPTIONS 请求,但如果你有自定义的过滤器或拦截器,可能需要手动处理:

代码语言:txt
复制
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.OncePerRequestFilter;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Configuration
public class CorsFilter {

    @Bean
    public OncePerRequestFilter corsFilter() {
        return new OncePerRequestFilter() {
            @Override
            protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
                    throws ServletException, IOException {
                response.setHeader("Access-Control-Allow-Origin", "http://example.com");
                response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
                response.setHeader("Access-Control-Allow-Headers", "*");
                response.setHeader("Access-Control-Allow-Credentials", "true");
                response.setHeader("Access-Control-Max-Age", "3600");

                if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
                    response.setStatus(HttpServletResponse.SC_OK);
                } else {
                    filterChain.doFilter(request, response);
                }
            }
        };
    }
}

在这个示例中,我们创建了一个自定义的过滤器来处理 CORS 相关的响应头,并且手动处理了 OPTIONS 请求。

参考链接

通过以上配置和处理,应该可以解决 Access-Control-Allow-Origin 不工作的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

springboot去掉spring-boot-starter-actuator依赖task任务工作

springboot以其开箱即用,入门门槛低的特性越来越受开发者欢迎,使用过spring的人都知道spring的入门首先要解决的就是繁杂的配置,而springboot在这方面就做的很到位--快速上手...笔者今天在使用中就遇到一个很奇怪的问题:注释掉spring-boot-starter-actuator依赖后,原本正常工作的任务工作了,其实这个问题就在于没好好看springboot关于task使用时的警告...好了卖关子了,我们来看一下spring-boot-starter-actuator依赖与任务有什么猫腻: @Configuration @EnableScheduling @ConditionalOnProperty...class MetricExportAutoConfiguration spring-boot-starter-actuator这个依赖存在时会自动帮你加上EnableScheduling注解,到这里就解释了为什么我们不在...configuration里面加EnableScheduling注解去掉spring-boot-starter-actuator依赖后任务就不工作的问题!

3.6K10

推荐使用Spring Boot 2.2.0

版本变化 依赖 项目版本 目标版本 Spring Boot 2.1.9.RELEASE 2.2.0.RELEASE Spring Cloud Greenwich.SR3 Hoxton.RC1 Spring...Boot Admin 2.1.6 2.2.0 Hoxton 版本依赖厂库 目前 Spring Cloud Hoxton 未发布 RELEASE 版本,官方计划 本月发布 ?... spring boot admin 未发布 2.2.0 适配版本 解决方法: 使用快照版本2.2.0-SNAPSHOT, 需要配置快照厂库 <id...boot 2.2.0 bug ,造成 和mybatis 3.5.2 兼容 官方issue 构造器注入的问题, mybatis 私有构造器不能绑定属性, 造成其他 依赖mybatis 的框架 类型...总结 由于使用的 Spring Cloud RC 版本未同步到 阿里云等国内镜像厂库 mvn clean install 可能会出现失败,建议重复执行几次即可 ---- 鉴于Spring Boot 2.2.0

1.1K20
  • Java面试——Spring Boot

    但是,我们有 Spring呀,真的是 Java 开发人员的福音。SpringBoot 就是为解决这些问题而生的。让我们写一个 Helloword 跟动态语言一样简单。...在部署环境中 Spring Boot 对比 Spring的一些优点包括: ■ 提供嵌入式容器支持; ■ 使用命令 java -jar独立运行 jar; ■ 在外部容器中部署时,可以选择排除依赖关系以避免潜在的...---- Spring Boot 支持 Java Util Logging、Log4j2、Lockback 作为日志框架,如果你使用 starters启动器,Spring Boot 将使用Logback...-jar springboot.jar --name="Java技术栈"`; 5、命令行中的 `SPRING_APPLICATION_JSONJSON` 指定参数, 如 `java Dspring.application.json...、JNDI参数(如 `java:comp/env/spring.application.json`); 9、Java系统参数(来源:`System.getProperties()`); 10、操作系统环境变量参数

    84310

    Java 小记 — Spring Boot 注解

    前言 本篇随笔将对 Spring Boot 中的常用注解做一个简单的整理归档,写作顺序将从启动类开始并逐步向内外扩展,目的即为了分享也为了方便自己日后的回顾与查阅。 1....AutoConfigurationImportSelector.class) public @interface EnableAutoConfiguration { String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration...基本注解 3.1 @Service & @Repository 他们是在 Spring Boot 中轻松实现面向接口编程的关键,一个用于逻辑层,一个用于数据层,示例如下: public interface...Boot 默认配置了这么一条 Bean: <bean id="HelloService" class="com.youclk.annotation.service.impl.HelloServiceImpl...<em>Boot</em> 提倡约定优于配置,但有的时候我们不想守约,如下: @Configuration public class DbConfiguration { private

    749130

    spring boot activiti工作流_activiti工作流优缺点

    SpringBoot集成activiti工作流(模拟请假流程) 链接:https://pan.baidu.com/s/10BT_Zertm1WBBrlrdE-QWQ 提取码:zsq6 学习视频地址见腾讯课堂...: 【Activiti】工作流从入门到精通【雷哥】-学习视频教程-腾讯课堂 其他代码都是最原始的测试activiti 的api代码,整合springboot的所有代码见下图. 1.pom文件... org.activiti activiti-spring-boot-starter-basic....启动类排除掉权限SecurityAutoConfiguration类,不然启动失败.报找不着这个类的问题 @SpringBootApplication(exclude = org.activiti.spring.boot.SecurityAutoConfiguration.class...本站仅提供信息存储空间服务,拥有所有权,承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    1.1K30

    启动Spring Boot时,如果设置内存参数会如何?

    最近正在进行从Spring BootSpring Cloud上改造升级。之前部署的应用程序比较少,还没什么问题。当Spring Cloud项目逐步新增之后,问题就爆发了,服务器内存不够用了。...而现有的用户体量也没必要对服务器再次进行升级,于是就开始着手Spring Boot启动时JVM内存配置的优化。...那么,在Spring Boot中如果未设置JVM内存参数时,JVM内存是如何配置的呢?...JVM默认内存设置 当运行一个Spring Boot项目时,如果未设置JVM内存参数,Spring Boot默认会采用JVM自身默认的配置策略。在资源比较充足的情况下,开发者倒是不太用关心内存的设置。...我们可以通过Java命令自带的功能来查看默认的内存设置。

    7K32

    spring boot的自动配置原理_springboot的工作原理

    我还记得我朋友几年前去参加的JAVA培训班,培训半年时间,让你可以上手做简单的JAVA系统开发。同学里有做厨师的,有做理发师的,有链家的。大家都一股脑地想挤进IT行业。...可以这么说,有了SpringBoot,初中生都能做JAVA开发。从此大量的人就开始了灰头土脸的初级程序员开发之路,埋着头往前走。 为什么要说这些呢?...@EnableAutoConfiguration解读(重点) 前两个注解好像不痛痒,那么Spring Boot的核心到底在哪儿呢? 接下来要开始烧脑解读了。...这也能够解释了,为什么工作中我们的主启动类一定要放在根目录下,因为这样才能扫描到该项目所有目录的类信息。否则只能用@ComponentScan去手动的扫描目标路径。 1.3.2....我记得我刚找工作那会儿,我只要8000的工资,面试官都要问这个问题。我真TM的醉了! 我的另一篇文章:深入springboot怎么启动tomcat.

    40020
    领券