在Java项目中实现跨域资源共享(CORS)

简介: 在Java项目中实现跨域资源共享(CORS)

在Java项目中实现跨域资源共享(CORS)

在现代Web开发中,前后端分离的架构已经变得非常普遍。在这种架构中,前端和后端通常运行在不同的域名或端口下,这就带来了跨域请求的问题。为了安全性,浏览器默认禁止跨域请求,但我们可以通过设置跨域资源共享(CORS,Cross-Origin Resource Sharing)来允许特定的跨域请求。本文将介绍如何在Java项目中实现CORS。

1. CORS概述

CORS是一个W3C标准,它允许服务器指示哪些跨域请求是被允许的。CORS通过增加HTTP头来告知浏览器,某些请求是被允许的。常用的CORS头包括:

  • Access-Control-Allow-Origin:指定允许访问的源。
  • Access-Control-Allow-Methods:指定允许的HTTP方法。
  • Access-Control-Allow-Headers:指定允许的请求头。
  • Access-Control-Allow-Credentials:是否允许发送Cookie。
  • Access-Control-Max-Age:预检请求的缓存时间。

2. 在Spring Boot中实现CORS

Spring Boot是一个流行的Java框架,提供了多种方式来实现CORS。下面介绍几种常见的方法。

2.1 在控制器上设置CORS

我们可以在控制器的方法或类上使用@CrossOrigin注解来设置CORS。

示例代码:

package cn.juwatech.controller;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
    @CrossOrigin(origins = "http://example.com")
    @GetMapping("/hello")
    public String hello() {
        return "Hello, World!";
    }
}

在上述代码中,我们在hello方法上添加了@CrossOrigin注解,指定允许来自http://example.com的跨域请求。

2.2 全局配置CORS

如果需要对所有请求启用CORS,可以通过全局配置来实现。

示例代码:

package cn.juwatech.config;
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 WebConfig {
    @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);
            }
        };
    }
}

在上述代码中,我们通过实现WebMvcConfigurer接口的addCorsMappings方法,全局配置了CORS。

2.3 使用过滤器配置CORS

除了使用注解和全局配置外,还可以通过过滤器来配置CORS。

示例代码:

package cn.juwatech.filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class CORSFilter extends HttpFilter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 初始化代码
    }
    @Override
    protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        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");
        chain.doFilter(request, response);
    }
    @Override
    public void destroy() {
        // 销毁代码
    }
}

注册过滤器:

package cn.juwatech.config;
import cn.juwatech.filter.CORSFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean<CORSFilter> corsFilter() {
        FilterRegistrationBean<CORSFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new CORSFilter());
        registrationBean.addUrlPatterns("/*");
        return registrationBean;
    }
}
• 1

在上述代码中,我们定义了一个CORS过滤器,并通过FilterRegistrationBean将其注册到Spring Boot应用中。

3. 处理复杂请求

浏览器在发送某些复杂请求(如PUTDELETE请求或带有自定义头部的请求)之前,会先发送一个预检请求(OPTIONS请求)。服务器需要响应预检请求以告知浏览器是否允许实际请求。

示例代码:

package cn.juwatech.config;
import org.springframework.web.bind.annotation.RequestMethod;
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;
public class CORSFilter extends 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, OPTIONS");
        response.setHeader("Access-Control-Allow-Headers", "*");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Max-Age", "3600");
        if (RequestMethod.OPTIONS.name().equalsIgnoreCase(request.getMethod())) {
            response.setStatus(HttpServletResponse.SC_OK);
        } else {
            filterChain.doFilter(request, response);
        }
    }
}

在上述代码中,我们扩展了OncePerRequestFilter,并在OPTIONS请求时返回200 OK状态码,从而处理预检请求。

总结

在Java项目中实现跨域资源共享(CORS)是解决前后端分离架构中跨域请求问题的重要手段。通过使用Spring Boot提供的注解、全局配置和过滤器等方式,我们可以灵活地配置CORS,确保应用的安全性和跨域请求的正常处理。希望通过本文的介绍,大家能够更好地理解和实现CORS,从而优化Java Web应用的开发和部署。

相关文章
|
10月前
|
Java API 开发工具
【Azure Developer】Java代码实现获取Azure 资源的指标数据却报错 "invalid time interval input"
在使用 Java 调用虚拟机 API 获取指标数据时,因本地时区设置非 UTC,导致时间格式解析错误。解决方法是在代码中手动指定时区为 UTC,使用 `ZoneOffset.ofHours(0)` 并结合 `withOffsetSameInstant` 方法进行时区转换,从而避免因时区差异引发的时间格式问题。
422 4
|
消息中间件 机器学习/深度学习 Java
java 最新技术驱动的智能教育在线实验室设备管理与实验资源优化实操指南
这是一份基于最新技术的智能教育在线实验室设备管理与实验资源优化的实操指南,涵盖系统搭建、核心功能实现及优化策略。采用Flink实时处理、Kafka消息队列、Elasticsearch搜索分析和Redis缓存等技术栈,结合强化学习动态优化资源调度。指南详细描述了开发环境准备、基础组件部署、数据采集与处理、模型训练、API服务集成及性能调优步骤,支持高并发设备接入与低延迟处理,满足教育机构数字化转型需求。代码已提供下载链接,助力快速构建智能化实验室管理系统。
300 44
|
Java 程序员
JAVA程序员的进阶之路:掌握URL与URLConnection,轻松玩转网络资源!
在Java编程中,网络资源的获取与处理至关重要。本文介绍了如何使用URL与URLConnection高效、准确地获取网络资源。首先,通过`java.net.URL`类定位网络资源;其次,利用`URLConnection`类实现资源的读取与写入。文章还提供了最佳实践,包括异常处理、连接池、超时设置和请求头与响应头的合理配置,帮助Java程序员提升技能,应对复杂网络编程场景。
370 9
|
12月前
|
机器学习/深度学习 Java 大数据
Java 大视界 -- Java 大数据在智能政务公共资源交易数据分析与监管中的应用(202)
本篇文章深入探讨了 Java 大数据在智能政务公共资源交易监管中的创新应用。通过构建高效的数据采集、智能分析与可视化决策系统,Java 大数据技术成功破解了传统监管中的数据孤岛、效率低下和监管滞后等难题,为公共资源交易打造了“智慧卫士”,助力政务监管迈向智能化、精准化新时代。
|
缓存 安全 Java
【高薪程序员必看】万字长文拆解Java并发编程!(3-1):并发共享问题的解决与分析
活锁:多个线程相互影响对方退出同步代码块的条件而导致线程一直运行的情况。例如,线程1的退出条件是count=5,而线程2和线程3在其代码块中不断地是count进行自增自减的操作,导致线程1永远运行。内存一致性问题:由于JIT即时编译器对缓存的优化和指令重排等造成的内存可见性和有序性问题,可以通过synchronized,volatile,并发集合类等机制来解决。这里的线程安全是指,多个线程调用它们同一个实例的方法时,是线程安全的,但仅仅能保证当前调用的方法是线程安全的,不同方法之间是线程不安全的。
241 0
|
Java 程序员
【高薪程序员必看】万字长文拆解Java并发编程!(3-2):并发共享问题的解决与分析
wait方法和notify方法都是Object类的方法:让当前获取锁的线程进入waiting状态,并进入waitlist队列:让当前获取锁的线程进入waiting状态,并进入waitlist队列,等待n秒后自动唤醒:在waitlist队列中挑一个线程唤醒:唤醒所有在waitlist队列中的线程它们都是之间协作的手段,只有拥有对象锁的线程才能调用这些方法,否则会出现IllegalMonitorStateException异常park方法和unpark方法是LockSupport类中的方法。
246 0
|
JavaScript 前端开发 安全
在 Vue 项目中配置 CORS 的方法
【10月更文挑战第20天】在 Vue 项目中配置 CORS 需要综合考虑后端服务器配置、代理服务器使用以及前端的有限配置等多种因素。通过合理的配置和处理,可以有效地解决跨域问题,为项目的顺利进行提供保障。
|
监控 JavaScript 安全
在 Vue 项目中配置 CORS 时的注意事项
【10月更文挑战第20天】在 Vue 项目中配置 CORS 需要综合考虑多个方面的因素,从配置的准确性、稳定性、兼容性到测试、监控和安全等。通过细心的规划和实施,以及与团队成员的协作,可以有效地解决跨域问题,并确保项目的顺利进行。