调用Spark.unmap()禁用API时出现CORS问题,本地请求被SparkJava服务器拒绝
SparkJava调用
Spark.unmap()触发CORS异常解决方案 调用
Spark.unmap(path)方法会触发CORS策略异常,具体表现如下:
- 执行unmap操作后,运行在localhost上的前端应用发起的请求无法通过SparkJava服务器的CORS校验,被直接拦截
- 重启服务器后所有功能恢复正常,此前通过unmap禁用的插件API仍保持禁用状态
- 重新启用已禁用的API不会触发CORS异常
- 对任意插件API再次执行unmap禁用操作时,CORS问题会100%复现
根因分析
该问题由SparkJava的路由匹配机制导致:
- 常规CORS配置会为所有路径绑定OPTIONS请求处理器,负责返回跨域校验所需的
Access-Control-*系列响应头 - 调用无指定HTTP方法的
Spark.unmap(path)时,会移除该路径下所有HTTP方法的路由映射,包括OPTIONS方法的映射 - 浏览器发起跨域请求前会先发送OPTIONS预检请求,对应路径的OPTIONS映射被删除后,服务端无法返回合法的CORS响应头,就会触发跨域拦截
- 重启服务器后路由会重新初始化,未被显式禁用的路径的OPTIONS映射会重新注册,因此CORS校验恢复正常
修复方案
方案1:注册全局优先级最高的OPTIONS过滤器
在所有业务路由注册之前,添加全局OPTIONS拦截器,不与具体业务路径绑定,不会被unmap操作影响:
// 必须放在所有路由注册的最顶部,保证优先级最高 options("/*", (request, response) -> { response.header("Access-Control-Allow-Origin", "*"); response.header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); response.header("Access-Control-Allow-Headers", "Content-Type, Authorization"); response.status(200); return ""; }); // 后续再注册业务路由、执行unmap禁用操作
方案2:unmap时指定要移除的HTTP方法
不要直接调用无HTTP方法参数的unmap方法,仅移除需要禁用的业务方法映射,保留OPTIONS映射:
// 错误写法:会移除该路径下所有HTTP方法的映射,包含OPTIONS Spark.unmap("/plugin/api/path"); // 正确写法:仅移除需要禁用的业务方法,保留OPTIONS映射 Spark.unmap("/plugin/api/path", "GET"); Spark.unmap("/plugin/api/path", "POST");
内容的提问来源于stack exchange,提问作者Nunna
相关产品推荐
相关产品推荐

