2016-03-08 131 views
4

我使用春季启动在服务器端和Angularjs在客户端,我使用过滤,它配置春季启动应用CORS工作了GETPOST方法,但是,当我试图发送PUT使用$ HTTP模块的要求,我在浏览器控制台得到这个:请求方法“选项”不支持 - 春季启动应用

说明:URL = http://localhost:8080/localbusinessusers/[object%20Object]

OPTIONS URL (匿名功能)@ 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无法加载 url。对于预检的响应 具有无效的HTTP状态代码405 angular.js:11442 XHR 加载失败:PUT “”url“。

,我得到了这对春季启动控制台

2016年3月8日23:19:51.212 WARN 27044 --- [XNIO-2任务2] osweb。 servlet的。PageNotFound:请求方法 '选项' 不支持

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 

    } 

} 

REST方法在我RestController

@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客户端

回答

4

如果选择请求被禁止的,可以配置DispatcherServlet将所有选项请求发送到您的application.properties

spring.mvc.dispatch-options-request=true 

有关使用Spring启动选项请求和Spring MVC的更多信息,有一个很好的职位Handling Options Request using Spring Boot

您也可以尝试在这个职位的例子通过创建一个简单的处理CORS和支持选项的请求控制器返回所有选项请求的NO_CONTENT:http://dontpanic.42.nl/2015/04/cors-with-spring-mvc.html

+0

我编辑了我的application.properties文件,但仍然收到相同的错误 – jemlifathi

+0

我更新了答案并附加了一个链接。 – pczeus

+0

NO_CONTENT选项请求控制器对您有帮助吗? – pczeus