在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应用的开发和部署。

目录
打赏
0
1
1
0
122
分享
相关文章
2025 年 Java 全栈从环境搭建到项目上线实操全流程指南:Java 全栈最新实操指南(2025 版)
本指南涵盖2025年Java全栈开发核心技术,从JDK 21环境搭建、Spring Boot 3.3实战、React前端集成到Docker容器化部署,结合最新特性与实操流程,助力构建高效企业级应用。
216 1
Java 学习路线规划及项目案例中的技术栈应用解析
内容包括:**Java 17核心特性**(如sealed class、record)与模块化开发;Spring Boot 3 + Spring Cloud微服务架构,涉及响应式编程(WebFlux)、多数据库持久化(JPA、R2DBC、MongoDB);云原生技术**如Docker、Kubernetes及CI/CD流程;性能优化(GraalVM Native Image、JVM调优);以及前后端分离开发(Vue 3、Spring Boot集成)。通过全栈电商平台项目实战,掌握从后端服务(用户、商品、订单)到前端应用(Vue 3、React Native)的全流程开发。
139 9
现代化 Java Web 在线商城项目技术方案与实战开发流程及核心功能实现详解
本项目基于Spring Boot 3与Vue 3构建现代化在线商城系统,采用微服务架构,整合Spring Cloud、Redis、MySQL等技术,涵盖用户认证、商品管理、购物车功能,并支持Docker容器化部署与Kubernetes编排。提供完整CI/CD流程,助力高效开发与扩展。
230 63
Java 大学期末实操项目在线图书管理系统开发实例及关键技术解析实操项目
本项目基于Spring Boot 3.0与Java 17,实现在线图书管理系统,涵盖CRUD操作、RESTful API、安全认证及单元测试,助力学生掌握现代Java开发核心技能。
93 0
java Web 项目完整案例实操指南包含从搭建到部署的详细步骤及热门长尾关键词解析的实操指南
本项目为一个完整的JavaWeb应用案例,采用Spring Boot 3、Vue 3、MySQL、Redis等最新技术栈,涵盖前后端分离架构设计、RESTful API开发、JWT安全认证、Docker容器化部署等内容,适合掌握企业级Web项目全流程开发与部署。
113 0
Java 项目分层架构实操指南及长尾关键词优化方案
本指南详解基于Spring Boot与Spring Cloud的Java微服务分层架构,以用户管理系统为例,涵盖技术选型、核心代码实现、服务治理及部署实践,助力掌握现代化Java企业级开发方案。
128 2
掌握Java反射:在项目中高效应用反射机制
Java反射是一种强大功能,允许程序在运行时动态获取类信息、创建对象、调用方法和访问字段,提升程序灵活性。它在框架开发、动态代理、注解处理等场景中广泛应用,如Spring和Hibernate。但反射也存在性能开销、安全风险和代码复杂性,应谨慎使用。
一个完整 Java 项目常包含的各层次详解与全面解析
本内容介绍了Java项目的典型分层架构,涵盖开放接口层、终端显示层、Web层、Service层、Manager层、Mapper层及常用辅助层次,如实体层、DTO层、VO层等。通过合理划分各层职责,结合Spring Boot等框架,实现系统的高内聚、低耦合,提升可维护性与扩展性,适用于微服务与MVC架构设计。
332 0
【JavaEE】从 0 到 1 掌握 Maven 构建 Java 项目核心技巧 解锁 Java 项目高效管理实用实例
本文从Maven基础概念讲起,涵盖安装配置、核心概念(如POM与依赖管理)及优化技巧。结合Java Web项目实例,演示如何用Maven构建和管理项目,解决常见问题,助你高效掌握这一强大工具,提升Java开发与项目管理能力。适合初学者及进阶开发者学习。资源链接:[点此获取](https://pan.quark.cn/s/14fcf913bae6)。
142 6

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问