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

Angular中Delete请求失败,Postman可正常执行,求问题排查

问题分析

你遇到的status: 0 + error: abort错误,本质是浏览器层面的请求拦截——Postman不受浏览器同源策略和CSRF防护限制,所以能正常执行,而Angular在浏览器环境中触发了拦截规则。以下是具体排查和解决方法:


可能的问题及解决方案

1. Spring CSRF防护拦截请求

Spring Boot默认对非GET请求(如DELETE)启用CSRF防护,浏览器请求必须携带CSRF Token,否则会被直接拦截,导致请求abort。

解决方法:
配置Spring Security的CSRF Token存储方式,让Angular能自动获取并携带Token:

// Spring Security 6+ 配置示例
@Configuration
public class SecurityConfig {
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.csrf(csrf -> csrf
            .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
        );
        // 保留原有CORS或其他安全配置
        return http.build();
    }
}

Angular的HttpClient会自动从Cookie读取XSRF-TOKEN,并在请求头添加X-XSRF-TOKEN,无需额外代码,只需确保请求启用凭证携带(见下文)。

2. Angular请求未启用凭证携带

后端CORS配置开启了allowCredentials(true),但Angular请求未携带凭证(如Cookie中的CSRF Token),导致浏览器拦截请求。

解决方法:
修改Angular服务中的delete请求,添加withCredentials: true参数:

public delete(guestId: number) {
    return this.http.delete(this.guestUrl + guestId, { withCredentials: true });
}

3. CORS预检请求未通过

浏览器会先发OPTIONS预检请求,若后端CORS配置未允许必要的请求头,会导致预检失败,终止原DELETE请求。

解决方法:
更新CORS配置,允许所有请求头:

public void addCorsMappings(CorsRegistry registry) {
    registry
            .addMapping("/**")
            .allowedOriginPatterns("https://*:*", "http://*:*")
            .allowedMethods("GET", "POST", "PUT", "DELETE")
            .allowedHeaders("*") // 新增:允许所有请求头
            .allowCredentials(true)
            .maxAge(3600);
}

4. 后端接口路径匹配排查(低概率)

确认后端控制器类的@RequestMapping路径是否正确,确保eventId能被正确解析。比如控制器类上需有:

@RequestMapping("/events/{eventId}/guests")
public class GuestController {
    // 你的delete方法
}

(你提到Postman可正常执行,此问题概率较低,但可快速验证)


内容的提问来源于stack exchange,提问作者Jonas Van Reeth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 02:10:30