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

Micronaut开发环境下预检请求均返回405的配置异常排查

开发环境下Micronaut服务预检OPTIONS请求返回405 Method Not Allowed问题排查

问题场景

Micronaut服务接收来自https://app.company.com的预检请求时,出现CORS「405 Method Not Allowed」错误,该问题仅出现在开发环境,本地环境无异常。

当前CORS配置

micronaut:
  server:
    cors:
      enabled: true
      configurations:
        ui:
          allowed-origins:
            - 'https://app.company.com'

已尝试的无效解决方案

  • 服务端拦截器:实现Micronaut过滤器拦截OPTIONS请求并返回「OK」状态,本地有效但开发环境无效。
  • 添加Access-Control-Request-Method请求头:在客户端请求中添加Access-Control-Request-Method: GET,本地有效但开发环境无效。

问题详情

  • 客户端应用向Micronaut服务发送GET请求,仅预检OPTIONS请求返回405错误。
  • 仅开发环境存在问题,相同配置在本地环境可正常工作。
  • 已确认开发环境中allowed-origins配置正确。

可能原因

  1. 开发环境中间件干扰:开发环境的反向代理、API网关(如NGINX)可能先拦截OPTIONS请求,未转发至Micronaut服务,或自身CORS配置与服务端冲突。
  2. 配置加载优先级问题:开发环境可能加载了高优先级配置文件(如application-dev.yml),覆盖了主配置中的CORS设置,导致实际生效配置不符合预期。
  3. CORS配置缺失关键参数:当前仅配置allowed-origins,但预检请求需要allowed-methods、allowed-headers等参数,Micronaut默认配置可能未覆盖必要项,导致浏览器判定不通过。
  4. 网络策略限制:开发环境的安全组、防火墙可能拦截OPTIONS请求,或限制CORS响应头的返回。

调试步骤

  1. 验证实际生效的CORS配置:
    • 在服务中添加日志或端点,输出加载的CORS配置详情,确认allowed-origins、allowed-methods等参数是否正确。
    • 可通过@Value注解读取配置值,或使用Micronaut配置检查工具。
  2. 抓包分析请求链路:
    • 用浏览器开发者工具或Wireshark捕获OPTIONS请求与响应,检查:
      • 请求是否真正到达Micronaut服务(查看目标地址、X-Forwarded-For等请求头)。
      • 响应头是否包含Access-Control-Allow-Origin、Access-Control-Allow-Methods等必要CORS头。
  3. 排查中间件配置:
    • 检查开发环境反向代理、网关的CORS配置,确认是否存在拦截OPTIONS请求、覆盖服务端响应头的情况。
  4. 补充完整CORS配置:
    • 更新配置,添加预检所需参数后重新部署测试:
      micronaut:
        server:
          cors:
            enabled: true
            configurations:
              ui:
                allowed-origins:
                  - 'https://app.company.com'
                allowed-methods:
                  - GET
                  - OPTIONS
                allowed-headers:
                  - '*'
                allow-credentials: true
                max-age: 3600
      
  5. 直接测试服务端点:
    • 绕过中间件,直接访问Micronaut服务的IP和端口发送OPTIONS请求,若返回200则说明问题出在中间件。
  6. 调整过滤器优先级:
    • 自定义OPTIONS拦截过滤器可能优先级低于Micronaut内置CORS过滤器,通过@Filter(order = -1)调整优先级,确保自定义逻辑先执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 16:45:14