Java中解决跨域问题

在Java Web开发中,跨域资源共享(CORS, Cross-Origin Resource Sharing)问题经常遇到,特别是在前端和后端分离的应用中。跨域问题主要出现在浏览器安全策略中,当一个资源(如HTML页面)尝试从不同的源(协议、域名或端口中的任何一个不同)加载资源时,就会触发浏览器的同源策略限制。

为了解决这个问题,后端服务器需要配置以允许来自不同源的请求。在Java中,这通常通过配置Servlet容器(如Tomcat, Jetty等)或直接在Web框架(如Spring MVC, JAX-RS等)中设置响应头来实现。

使用Spring MVC配置CORS

如果你正在使用Spring MVC,你可以通过实现WebMvcConfigurer接口来全局配置CORS,或者使用@CrossOrigin注解在方法或控制器级别进行配置。

全局配置CORS
java 复制代码
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 implements WebMvcConfigurer {  
  
    @Override  
    public void addCorsMappings(CorsRegistry registry) {  
        registry.addMapping("/**") // 允许所有路径  
            .allowedOrigins("http://example.com") // 允许访问的源  
            .allowedMethods("GET", "POST", "PUT", "DELETE") // 允许的HTTP方法  
            .allowedHeaders("*") // 允许的头信息  
            .allowCredentials(true) // 是否允许发送Cookies  
            .maxAge(3600); // 预检请求的缓存时间(秒)  
    }  
}
方法级别配置CORS
java 复制代码
import org.springframework.web.bind.annotation.CrossOrigin;  
import org.springframework.web.bind.annotation.GetMapping;  
import org.springframework.web.bind.annotation.RestController;  
  
@RestController  
public class MyController {  
  
    @CrossOrigin(origins = "http://example.com")  
    @GetMapping("/greeting")  
    public String greeting() {  
        return "Hello, World!";  
    }  
}

使用Spring Boot的@CrossOrigin

在Spring Boot应用中,@CrossOrigin注解的使用方式与Spring MVC相同。Spring Boot应用通常会自动配置Spring MVC,所以你可以直接在控制器或方法上使用@CrossOrigin注解。

使用过滤器(Filter)配置CORS

如果你不使用Spring MVC或想要更细粒度的控制,你可以通过实现一个Filter来手动设置CORS响应头。

java 复制代码
import javax.servlet.*;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
import java.io.IOException;  
  
public class SimpleCORSFilter 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", "POST, GET, OPTIONS, DELETE");  
        response.setHeader("Access-Control-Max-Age", "3600");  
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with, authorization");  
  
        if ("OPTIONS".equalsIgnoreCase(((HttpServletRequest) req).getMethod())) {  
            response.setStatus(HttpServletResponse.SC_OK);  
        } else {  
            chain.doFilter(req, res);  
        }  
    }  
  
    // 省略其他方法...  
}

然后在Web应用中注册这个过滤器。

这些是在Java Web应用中处理CORS问题的几种常见方法。根据具体需求和使用的技术栈,可以选择最适合的方案。

相关推荐
学长毕业设计4 小时前
基于springboot的云南中草药知识普及管理网站的设计与开发(源码+文档+讲解视频)
java·spring boot·后端
大模型码小白4 小时前
AI 提示词专栏:使用系统指令(System Prompt)实现全局约束
java·大数据·运维·开发语言·人工智能·python·prompt
cxoptics4 小时前
蓝宝石的轴向在窗片和偏振片中起的作用
java
wuminyu4 小时前
Java FFM处理网络读写事件源码剖析
java·linux·c语言·jvm·c++
小江的记录本4 小时前
【AI Agent】《2026年9月 AI Agent全栈开发技术选型专项面试宝典》
java·spring boot·python·spring·ai·面试·ai编程
梦梦代码精5 小时前
《LikeShop全产品技术硬核拆解:ThinkPHP8+Vue3+UniApp架构,私有化部署与二次开发实战指南》
java·低代码·系统架构·php·开源软件
一木 之林5 小时前
C/C++ 面向对象编程(OOP)(进阶)
java·c语言·c++
摇滚侠5 小时前
《SpringBoot 3:入门与应用实战》第 9 章 使用 WebMvc 开发应用 阅读笔记 2
java·spring boot·笔记
technology_x6 小时前
液冷超充站设备厂家哪家好?2026年功率与散热对比
java·开发语言
LayZhangStrive6 小时前
Agent开发 - MCP Client使用MCP Server的几种方式(Spring AI)
java·spring ai·mcp