不支持请求方法“OPTIONS”-Spring Boot 应用程序

Posted

技术标签:

【中文标题】不支持请求方法“OPTIONS”-Spring Boot 应用程序【英文标题】:Request method 'OPTIONS' not supported - Spring Boot Application 【发布时间】:2016-06-23 02:53:49 【问题描述】:

我在服务器端使用 Spring Boot,在客户端使用 Angularjs,我配置了 Spring Boot 应用程序 CORS 使用 Filter,它适用于 GETPOST 方法,但是,当我尝试发送 PUT使用 $http 模块请求,我在浏览器控制台中得到了这个:

注意:url = http://localhost:8080/localbusinessusers/[object%20Object]

选项 网址 (匿名函数)@ angular.js:11442sendReq @ angular.js:11235serverRequest @ angular.js:10945processQueue @ angular.js:15552(匿名函数)@ angular.js:15568Scope.$eval @ angular.js:16820Scope.$digest @ angular.js:16636Scope.$apply @ angular.js:16928done @ angular.js:11266completeRequest @ angular.js:11464requestLoaded @ angular.js:11405 app.html:1 XMLHttpRequest 无法加载 网址。回复 对于预检具有无效的 HTTP 状态代码 405 angular.js:11442 XHR 加载失败:PUT “网址”。

我在 Spring Boot 控制台上得到了这个:

2016-03-08 23:19:51.212 警告 27044 --- [XNIO-2 任务 2] os.web.servlet.PageNotFound:请求方法'OPTIONS' 不支持

我的 CORS 过滤器

package com.datcom.fouras;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Component;

@Component
public class CorsFilter implements Filter 

    @Override
    public void init(FilterConfig filterConfig) throws ServletException 
        // TODO Auto-generated method stub

    

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException 
        HttpServletResponse response = (HttpServletResponse) res;
        response.setHeader("Access-Control-Allow-Origin", "http://localhost");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "Content-Type, x-requested-with, X-Custom-Header");
        chain.doFilter(req, res);

    

    @Override
    public void destroy() 
        // TODO Auto-generated method stub

    


我的 RestController 中的 REST 方法:

@RequestMapping(value = "/localbusinessusers", method = RequestMethod.PUT)
    public LocalBusinessUser update(LocalBusinessUser localBusinessUser) 
        log.debug("REST request to update a local business user : ", localBusinessUser);
        if (localBusinessUser.getId() == null) 
            return save(localBusinessUser);
         else 
            LocalBusinessUser localBusinessUser2 = localBusinessUserRepository.findOne(localBusinessUser.getId());
            localBusinessUser2 = localBusinessUser;
            return localBusinessUserRepository.saveAndFlush(localBusinessUser2);
        
    

最后,我的 $http 请求:

$http.put('http://localhost:8080/localbusinessusers/' + localBusinessUser)
                .success(function (data, status, headers) 
                    console.log('data: ' + data);
                )
                .error(function (data, status, header, config) 
                    console.log('data: ' + data);
                    console.log('status: ' + status);
                    console.log('header: ' + header);
                    console.log('config: ' + config);
                );

注意: PUT 请求正在使用 高级 REST 客户端

【问题讨论】:

【参考方案1】:

如果选项请求被禁止,您可以配置 DispatcherServlet 以通过将其添加到您的 application.properties 来调度所有选项请求:

spring.mvc.dispatch-options-request=true

有关使用 Spring Boot 的选项请求和 Spring MVC 的更多信息,Handling Options Request using Spring Boot 有一篇不错的帖子

您还可以通过创建一个简单的控制器为所有选项请求返回 NO_CONTENT 来尝试处理 CORS 和支持选项请求的这篇文章中的示例:http://dontpanic.42.nl/2015/04/cors-with-spring-mvc.html

【讨论】:

我编辑了我的 application.properties 文件,但我仍然遇到同样的错误 NO_CONTENT 选项请求控制器对您有帮助吗? 实际上,我在 application.properties 文件中添加了这些行:# ENDPOINTS CORS CONFIGURATION (EndpointCorsProperties) endpoints.cors.allow-credentials = false endpoints.cors.allowed-headers = Content-Type , x-requested-with, X-Custom-Header endpoints.cors.allowed-methods = * endpoints.cors.allowed-origins = 164.132.198.236, localhost endpoints.cors.max-age = 3600

以上是关于不支持请求方法“OPTIONS”-Spring Boot 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

请求的资源不支持 http 方法 'OPTIONS'。?

使用 EnableCors 时“请求的资源不支持 http 方法 'OPTIONS'”

Spring Security Jwt Token在请求表单角度时允许所有Options方法

HTTP的options方法作用

为啥我的 Spring 控制器不处理 GraphiQL 发送的 OPTIONS 请求?

OPTIONS 方法在跨域请求(CORS)中的应用