Java跨域访问如何解决?

在Java中解决跨域访问,主要通过服务端配置实现: ,1. 使用@CrossOrigin注解标注Controller方法 ,2. 实现WebMvcConfigurer接口配置全局CORS规则 ,3. 通过过滤器手动添加响应头(如Access-Control-Allow-Origin) ,4. Spring Security中配置CorsConfigurationSource ,本质是服务端设置HTTP响应头允许跨域请求。

Spring Boot的@CrossOrigin注解(控制器级别)

适用场景:单个Controller或方法需要跨域

Java跨域访问如何解决?

@RestController
public class UserController {
    // 允许所有来源访问此接口
    @CrossOrigin(origins = "*")
    @GetMapping("/users")
    public List<User> getUsers() {
        return userService.getAllUsers();
    }
    // 限制特定域名访问
    @CrossOrigin(origins = "https://trusted-domain.com")
    @PostMapping("/update")
    public ResponseEntity updateUser() {
        // 业务逻辑
    }
}

优点:简单直接,无需全局配置
缺点:需在每个接口重复添加注解


全局CORS配置(Spring MVC)

适用场景:整个项目统一跨域规则

@Configuration
public class CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/api/**")  // 指定路径
                .allowedOrigins("https://www.example.com", "http://localhost:3000")
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                .allowedHeaders("*")
                .allowCredentials(true)
                .maxAge(3600);  // 1小时内预检请求缓存
    }
}

关键参数说明

  • allowCredentials(true):允许携带Cookie
  • maxAge(3600):减少OPTIONS预检请求次数

CorsFilter(Servlet容器级别)

适用场景:非Spring项目或需更底层控制

Java跨域访问如何解决?

@Bean
public CorsFilter corsFilter() {
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    CorsConfiguration config = new CorsConfiguration();
    config.setAllowCredentials(true);
    config.addAllowedOrigin("https://secure-client.org");
    config.addAllowedHeader("*");
    config.addAllowedMethod("OPTIONS");
    config.addAllowedMethod("GET");
    config.addAllowedMethod("POST");
    source.registerCorsConfiguration("/**", config); // 应用到所有路径
    return new CorsFilter(source);
}

Nginx反向代理(基础设施层解决)

适用场景:前端与API服务器分离部署

server {
    listen 80;
    server_name api.yourdomain.com;
    location / {
        # 允许跨域
        add_header 'Access-Control-Allow-Origin' 'https://web.yourdomain.com';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,Content-Type';
        add_header 'Access-Control-Allow-Credentials' 'true';
        # 反向代理到Java应用
        proxy_pass http://localhost:8080;
    }
}

优势:无需修改Java代码,性能更高


JSONP(传统方案,仅限GET请求)

适用场景:兼容老旧浏览器(不推荐新项目使用)

@GetMapping("/getData")
public void getData(HttpServletRequest req, HttpServletResponse res) {
    String callback = req.getParameter("callback"); // 获取回调函数名
    String data = "{"name":"John"}"; // JSON数据
    // 返回JavaScript函数调用
    res.setContentType("application/javascript");
    res.getWriter().write(callback + "(" + data + ")");
}

前端调用

Java跨域访问如何解决?

<script>
function handleData(data) {
    console.log(data.name); // 输出John
}
</script>
<script src="http://api-server.com/getData?callback=handleData"></script>

安全最佳实践

  1. 限制来源域名:避免使用,明确指定allowedOrigins
  2. 禁用敏感接口跨域:如/admin/**路径不开放CORS
  3. 启用HTTPS:跨域传输必须使用加密连接
  4. 验证Origin头:防止伪造请求(Spring Security可配置)

引用说明

  • Mozilla CORS指南:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CORS
  • Spring官方文档:https://docs.spring.io/spring-framework/reference/web/webmvc-cors.html
  • OWASP安全建议:https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html

原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/43075.html

(0)
酷盾叔的头像酷盾叔
上一篇 2025年7月1日 20:22
下一篇 2025年7月1日 20:26

相关推荐

  • 如何在Java中创建字符串数组?

    在Java中创建字符串数组主要有三种方式:1. 直接初始化:String[] arr = {“A”, “B”}; 2. 使用new关键字:String[] arr = new String[]{“A”, “B”}; 3. 声明长度后赋值:String[] arr = new String[2]; arr[0]=”A”;

    2025年6月18日
    100
  • 怎么编译java为jar文件怎么打开

    Java为jar文件,需先编写代码并编译成class文件,再创建清单文件,最后用jar命令打包,打开则可通过java -jar命令或双击(需配置环境变量)

    2025年7月9日
    000
  • Java如何实现随机字母生成

    在Java中获取随机字母可通过Random或ThreadLocalRandom类生成随机数,转换为字符实现,生成随机大写字母用(char)(‘A’ + random.nextInt(26)),小写字母将’A’替换为’a’,也可利用String和charAt()组合随机索引实现。

    2025年6月20日
    100
  • JavaEE文件如何打开

    JavaEE文件通常指Java企业版相关文件,如配置文件(.xml)、源代码(.java)或部署包(.war/.ear),打开方法取决于类型: ,- **文本文件**:用记事本、VS Code等文本编辑器直接查看内容。 ,- **源代码**:需用Eclipse、IntelliJ IDEA等Java开发工具导入项目后编辑。 ,- **部署包**:通过Tomcat、WebLogic等服务器部署运行,或使用解压工具(如WinRAR)解压查看内部文件。

    2025年7月1日
    100
  • Java push方法实现教程

    Java中的push方法通常用于栈(Stack)或双端队列(Deque)数据结构,将指定元素添加到集合的头部(栈顶),Stack.push(E item)将元素压入栈顶,Deque.push(E e)将元素插入队列前端,该方法不返回具体值,但可能抛出异常(如容量限制)。

    2025年6月18日
    100

发表回复

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

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN