PUT/DELETE 出现 403 错误,但 GET/POST 有效

Posted

技术标签:

【中文标题】PUT/DELETE 出现 403 错误,但 GET/POST 有效【英文标题】:PUT/DELETE got 403 Error but GET/POST works 【发布时间】:2018-05-23 01:25:49 【问题描述】:

有一个 Spring Boot 应用程序在后端运行。我已经实现了几个 GET/POST/PUT/DELETE API。

前端(AngularJS)可以做GET和POST,但是请求PUT和DELETE时会得到403 ERROR。 我添加了允许的来源(没有它 POST 将无法工作)来解决 CORS 问题。

CORS 设置

@Bean
public WebMvcConfigurer corsConfigurer() 
    return new WebMvcConfigurerAdapter() 
        @Override
        public void addCorsMappings(CorsRegistry registry) 
            registry.addMapping("/**").allowedOrigins("https://xxx1.com", "https://xxx2.com");
        
    ;

CSRF 设置:

  http.csrf().disable();

暂时禁用

下面是我的 DELETE 实现:

   @DeleteMapping("/listings/id")
    public ResponseEntity<Void> deleteListings(@PathVariable Long id) 
        log.debug("REST request to delete listings : ", id);
        this.listingsService.delete(id);
        return ResponseEntity.status(HttpStatus.OK).body(null);
    

有人可以帮忙吗?非常感谢!

【问题讨论】:

你能分享或展示你的代码吗,也许在 github 上? 【参考方案1】:

看起来你可以链接allowedMethods("GET","POST","PUT","DELETE") according to the docs。

这有帮助吗?

【讨论】:

这个链接也可能会派上用场:spring.io/blog/2015/06/08/cors-support-in-spring-framework 我已经测试过了,但没有运气。现在出现 405 错误。【参考方案2】:

在您的 spring-boot 项目中创建 CORSFilter.java 文件。

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CORSFilter implements Filter 

    /**
     * CORS filter for http-request and response
     */
    public CORSFilter() 
    

    /**
     * Do Filter on every http-request.
     */
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException 
        HttpServletResponse response = (HttpServletResponse) res;
        HttpServletRequest request = (HttpServletRequest) req;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "access_token, authorization, content-type");

        if ("OPTIONS".equalsIgnoreCase(request.getMethod())) 
            response.setStatus(HttpServletResponse.SC_OK);
         else 
            chain.doFilter(req, res);
        
    

    /**
     * Destroy method
     */
    @Override
    public void destroy() 
    

    /**
     * Initialize CORS filter 
     */
    @Override
    public void init(FilterConfig arg0) throws ServletException 
    

你可以参考这个帖子Angular 2 Spring Boot Login CORS Problems

【讨论】:

以上是关于PUT/DELETE 出现 403 错误,但 GET/POST 有效的主要内容,如果未能解决你的问题,请参考以下文章

尽管有 AllowAny 权限,django-rest-framework 在 POST、PUT、DELETE 上返回 403 响应

解决csrf引起的403错误

laravel向我显示此错误此路由不支持POST方法。支持的方法:GET,HEAD,PUT,DELETE

仅在 https 上出现禁止的 403 错误,但 url http 工作正常

PHP Curl出现403错误怎么办

MapMyFitness API 请求出现错误 403