You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular前端调用Play Framework后端接口触发CORS跨域问题咨询

为什么前端发起GET请求,后端会收到OPTIONS请求

这是浏览器的CORS预检机制导致的:

  • 跨域请求分为简单请求和非简单请求,当请求属于非简单请求时,浏览器会自动先发送OPTIONS方法的预检请求,校验后端是否允许当前跨域访问,只有预检通过后才会发送实际的GET请求。
  • Postman属于客户端工具,不会执行CORS预检逻辑,因此直接发GET就能正常获取结果。
    常见触发非简单请求的场景包括请求携带自定义头、Content-Type不符合简单请求要求等,你的场景中AngularJS的$http默认携带的请求头触发了预检机制。

解决方案(基于Play Framework)

你目前只配置了允许跨域的源,没有完整开启CORS处理逻辑,按以下步骤配置即可:

1. 引入Play官方过滤器依赖

在build.sbt中添加CORS过滤器依赖:

libraryDependencies += filters

2. 补全application.conf的CORS配置

替换你之前的单条跨域配置,添加完整的CORS规则:

# 启用CORS过滤器
play.filters.enabled += play.filters.cors.CORSFilter
# 允许的访问源,生产环境建议替换为实际前端地址http://localhost:3001更安全
play.filters.cors.allowedOrigins = ["*"]
# 允许的HTTP方法,必须包含OPTIONS
play.filters.cors.allowedHttpMethods = ["GET", "POST", "PUT", "DELETE", "OPTIONS"]
# 允许的请求头
play.filters.cors.allowedHttpHeaders = ["*"]
# 预检请求缓存时长,避免每次请求都重复发送OPTIONS
play.filters.cors.preflightMaxAge = 1 hour

3. 可选(旧版本Play需配置):添加OPTIONS路由兜底

如果配置完过滤器还是报OPTIONS请求错误,在conf/routes文件顶部添加路由规则:

OPTIONS   /*all   controllers.Application.options(all: String)

然后在对应的Application控制器中添加处理逻辑:

public Result options(String all) {
    return ok().withHeaders(
        "Access-Control-Allow-Origin", "*",
        "Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS",
        "Access-Control-Allow-Headers", "*"
    );
}

额外注意点

你当前代码中的请求URL拼接为'sample' + 'generalInfo',实际拼接结果为samplegeneralInfo,和报错日志中的/sample/generalInfo路径不一致,注意检查是否漏写了路径分隔符/。

内容的提问来源于stack exchange,提问作者Jonio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 03:03:01