Word Web加载项调用跨域Java REST API遇权限拒绝错误求助
解决Word Web加载项向Java API发送POST请求的CORS错误
你遇到的SCRIPT7002: XMLHttpRequest: Network Error 0x80070005, Access is denied和Redirect for CORS preflight is not allowed问题,核心原因是CORS预请求(OPTIONS请求)被服务器重定向了——浏览器对CORS预请求有严格限制,不允许其被重定向,一旦发生就会直接阻断请求并抛出错误。结合你的场景,我给你一步步的解决方案:
1. 修复服务器端的CORS配置(最关键)
首先要确保Java API服务器正确处理CORS预请求,并且不会对OPTIONS请求进行重定向:
针对Spring Boot后端的示例配置
如果你的Java API是基于Spring Boot的,可以通过全局CORS配置来解决:
@Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/web/check/**") // 允许Word加载项所在的域(测试阶段可用*,生产环境请指定具体域) .allowedOrigins("https://localhost:3000", "https://your-addin-domain.com") .allowedMethods("GET", "POST", "OPTIONS") .allowedHeaders("*") // 允许携带凭证(如果请求需要Cookie等信息) .allowCredentials(true) // 预请求缓存时间,减少OPTIONS请求次数 .maxAge(3600); } }
另外,要检查服务器是否有全局重定向规则(比如HTTP转HTTPS、URL末尾斜杠自动修正),必须排除OPTIONS请求的重定向。比如在Nginx配置里可以添加:
if ($request_method = OPTIONS) { return 200; }
2. 调整AJAX请求配置
你的现有AJAX配置有几个潜在问题,修改如下:
$.ajax({ async: true, // 同步请求(async: false)在现代浏览器和Office加载项沙盒中会被安全策略限制,必须用异步 crossDomain: true, // 跨域场景必须明确设为true url: "https://qa.dev.com:8443/web/check", // 去掉末尾斜杠,避免服务器重定向到无斜杠版本 method: "POST", data: d, contentType: "application/x-www-form-urlencoded", // 表单数据用这个;如果是JSON数据,改成"application/json"并转data为JSON字符串 // 若发送JSON数据,替换为以下两行: // data: JSON.stringify(d), // contentType: "application/json", xhrFields: { withCredentials: true // 需要携带Cookie等凭证时添加 }, success: function(response) { // 处理成功响应逻辑 }, error: function(xhr, status, error) { console.error("请求错误:", status, error); } });
重点说明:
- 同步请求在Office Web加载项环境中容易触发安全限制,务必改为异步。
crossDomain: true要明确设置,因为你是从Word加载项的域请求外部Java API,属于跨域场景。- 检查URL末尾的斜杠:如果服务器会自动把带斜杠的URL重定向到无斜杠版本,会直接触发预请求的重定向错误,要确保URL和服务器期望的一致。
3. 配置Word加载项的Manifest文件
Office Web加载项有自己的域访问限制,必须在manifest.xml中声明允许访问的外部API域名:
<Resources> <bt:Urls> <!-- 加载项自身的URL --> <bt:Url id="Taskpane.Url" DefaultValue="https://your-addin-domain.com/taskpane.html" /> <!-- 添加Java API的域名 --> <bt:Url id="ApiEndpoint" DefaultValue="https://qa.dev.com:8443" /> </bt:Urls> </Resources> <!-- 确保权限设置符合需求 --> <Permissions>ReadWriteDocument</Permissions>
如果API域名是动态的,也可以用Domain元素声明:
<Domains> <Domain>qa.dev.com</Domain> </Domains>
4. 验证预请求状态
用Fiddler再次追踪请求,确保OPTIONS请求返回200状态码,并且响应头包含正确的CORS信息:
Access-Control-Allow-Origin:匹配你的加载项域名Access-Control-Allow-Methods:包含POST方法Access-Control-Allow-Headers:包含你请求中发送的所有自定义头(如果有的话)
按照以上步骤调整后,应该就能解决CORS相关的错误了。
内容的提问来源于stack exchange,提问作者Varsha Khanna
相关产品推荐
相关产品推荐

