javascript - 不支持请求方法 'OPTIONS' - Spring Boot 应用程序

标签 javascript angularjs spring spring-boot cors

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

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

OPTIONS url (anonymous function) @ angular.js:11442sendReq @ angular.js:11235serverRequest @ angular.js:10945processQueue @ angular.js:15552(anonymous function) @ 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 cannot load url. Response for preflight has invalid HTTP status code 405 angular.js:11442 XHR failed loading: PUT "url".

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

2016-03-08 23:19:51.212 WARN 27044 --- [ XNIO-2 task-2] o.s.web.servlet.PageNotFound : Request method 'OPTIONS' not supported

我的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 客户端

最佳答案

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

spring.mvc.dispatch-options-request=true

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

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

关于javascript - 不支持请求方法 'OPTIONS' - Spring Boot 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35879612/

相关文章:

javascript - jQuery 文件上传小部件和使用模板

rest - Grails,Spring Security和Angular JS-如何保护URL?

java - 工厂方法的 Spring 注解

java - Spring 集成 - 队列/轮询器似乎在没有任何操作的情况下耗尽线程池

java - MongoDb Criteria 查询 LTE 不适用于数字

javascript - HTML5 视频源属性

javascript - 具有共享原型(prototype)的instanceof

javascript - 将html文件添加到div标签jquery

javascript - $http Promise 总是返回原始 Promise?

angularjs - 在服务器端渲染初始 Angular ng-view 并从那里获取