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

Navigator.sendBeacon调用logger.jsp出现403未知错误的排查咨询

看起来你遇到了个挺让人挠头的问题——同样是调用后端JSP,AJAX请求正常,换sendBeacon就报403。我来帮你一步步捋捋可能的原因和排查方向:

先搞懂sendBeacon和AJAX的核心差异

首先得明确,sendBeacon和普通AJAX的请求逻辑有不少区别:

  • sendBeacon默认发POST请求,但如果只传URL的话,请求体是空的,而且它的请求头规则、跨域处理逻辑和AJAX不太一样
  • 浏览器会给sendBeacon做后台发送的优化(不阻塞页面卸载),但这也可能导致它在Filter层面的处理流程和AJAX不同

重点排查这几个方向

1. 先抓包看真实请求细节

打开浏览器开发者工具的Network面板,找到sendBeacon调用logger.jsp的请求,重点盯这几个信息:

  • 请求方法是不是POST(sendBeacon默认是POST)
  • 请求头里的Origin值是什么(虽然你配置了*,但要确认实际发送的Origin有没有特殊情况)
  • 响应头里有没有CORS相关的头(比如Access-Control-Allow-Origin),如果没有,说明CorsFilter根本没处理这个请求
  • 看响应的具体内容(比如Tomcat返回的错误页面),有没有更详细的403原因提示(比如是CORS拦截还是权限拦截)

2. 检查CorsFilter的映射范围

你提供的CorsFilter配置里,filter-mapping的url-pattern没写完,但这很可能是关键问题:
如果你的filter-mapping只配置了特定路径(比如/VO/*),那logger.jsp的路径不在这个范围内,CorsFilter就不会处理它的请求,自然会报跨域403。而AJAX调用的VO.jsp刚好在映射范围内,所以正常。
一定要确保filter-mapping的url-pattern是/*,这样所有请求都会经过CorsFilter处理,比如:

<filter-mapping>
  <filter-name>CorsFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

3. 补全CorsFilter的必要配置

你目前只配置了允许所有源,但Tomcat的CorsFilter默认配置不全,比如默认允许的请求方法、请求头可能满足不了sendBeacon的需求。建议补充这些配置:

<filter>
  <filter-name>CorsFilter</filter-name>
  <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
  <init-param>
    <param-name>cors.allowed.origins</param-name>
    <param-value>*</param-value>
  </init-param>
  <!-- 补充允许的请求方法,覆盖默认值 -->
  <init-param>
    <param-name>cors.allowed.methods</param-name>
    <param-value>GET, POST, HEAD, OPTIONS, PUT, DELETE</param-value>
  </init-param>
  <!-- 补充允许的请求头 -->
  <init-param>
    <param-name>cors.allowed.headers</param-name>
    <param-value>Content-Type, X-Requested-With, Accept, Origin</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>CorsFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

另外,如果你的请求需要携带凭证(比如Cookie),还要注意:不能用*作为允许的源,必须指定具体的域名,同时加上allowCredentials配置:

<init-param>
  <param-name>cors.allowCredentials</param-name>
  <param-value>true</param-value>
</init-param>
<!-- 这里不能用*,要写具体的源,比如http://your-app-domain.com -->
<init-param>
  <param-name>cors.allowed.origins</param-name>
  <param-value>http://your-app-domain.com</param-value>
</init-param>

4. 排查其他可能的拦截规则

如果上面的排查都没问题,那要看看web.xml里有没有其他Filter或者安全约束(security-constraint)拦截了logger.jsp的请求。比如有些权限验证Filter可能只针对特定路径的请求,刚好logger.jsp触发了拦截规则,而VO.jsp没有。

备注:内容来源于stack exchange,提问作者Vinayak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 08:29:35