WSO2 APIM发布门户测试新API遇CORS及404错误求助
问题分析与解决方案
针对你遇到的CORS+404问题,结合Istio、WSO2 APIM和SpringBoot的环境,以下是具体的排查和解决步骤:
一、关于Filter包位置的结论
Filter所在的子包位置本身不会影响功能,核心问题是Spring容器是否能扫描到这个Filter并完成注册。只要子包在Spring的组件扫描范围内(或通过显式配置注册),Filter就能正常生效。
二、分步排查与解决
1. 先验证后端Filter是否真的生效
先绕过WSO2和Istio,直接访问SpringBoot服务的接口,发送OPTIONS预检请求,检查响应头是否包含Access-Control-Allow-Origin:
- 如果直接访问后端正常,说明问题出在WSO2 APIM或Istio层面;
- 如果直接访问也没有CORS头,说明Filter未被正确注册,按以下方式修复:
- 若Filter用
@WebFilter注解,需在SpringBoot主类添加@ServletComponentScan(basePackages = "你的Filter子包路径"),确保Spring扫描到该Filter; - 或者改用
@Bean方式显式注册Filter,确保它的执行优先级最高:@Configuration public class CorsConfig { @Bean public FilterRegistrationBean<CorsFilter> corsFilter() { FilterRegistrationBean<CorsFilter> registrationBean = new FilterRegistrationBean<>(); registrationBean.setFilter(new CorsFilter()); registrationBean.addUrlPatterns("/*"); registrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE); return registrationBean; } } - 检查
application.properties是否添加spring.mvc.dispatch-options-request=true,避免SpringBoot自动拦截OPTIONS请求导致Filter未触发。
- 若Filter用
2. WSO2 APIM层面排查
因为API未发布且无订阅,WSO2的网关可能直接拦截了请求:
- 路径配置错误导致404:核对API的上下文(Context)和资源路径(Resource Path),比如你请求的
/test/book/v1/api/v1/book/category,要确认API上下文是不是/test/book/v1,资源路径是不是/api/v1/book/category,避免路径重复匹配失败; - WSO2自身CORS配置:WSO2网关会优先处理CORS,即使后端有Filter也可能被覆盖。进入API编辑器的
Runtime Configurations -> CORS Configuration,启用CORS并设置:- 允许的Origin:
* - 允许的Methods:包含
OPTIONS、POST、GET等你需要的方法 - 允许的Headers:
*
- 允许的Origin:
- 未发布API的访问权限:WSO2对未发布的API默认可能限制访问,需在API的
Subscriptions页面开启测试权限,或生成测试令牌携带在请求头中访问。
3. Istio层面排查
Istio的Sidecar或网关可能拦截了OPTIONS请求:
- 检查VirtualService配置:确保路由规则包含
OPTIONS方法,或直接允许所有方法; - 配置Istio的CORS策略:如果Istio网关拦截了预检请求,可在VirtualService中添加CORS规则,比如:
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: test-book-api-vs spec: hosts: - host gateways: - your-gateway http: - match: - uri: prefix: /test/book/v1 route: - destination: host: your-springboot-service port: number: 8080 corsPolicy: allowOrigin: - "*" allowMethods: - POST - GET - PUT - OPTIONS - DELETE - PATCH allowHeaders: - "*" maxAge: "3600s"
三、排查顺序建议
- 直接访问后端服务验证Filter是否生效;
- 若后端正常,检查WSO2的API路径和CORS配置;
- 最后排查Istio的路由和CORS策略。
内容的提问来源于stack exchange,提问作者user2176576
相关产品推荐
相关产品推荐

