Java 跨来源请求被阻止的弹簧休息服务+;AJAX

Java 跨来源请求被阻止的弹簧休息服务+;AJAX,java,javascript,html,ajax,spring,Java,Javascript,Html,Ajax,Spring,无法调用spring REST服务 我的春季服务 @RequestMapping(value = "/MAS/authenticate", method = RequestMethod.POST) public ResponseEntity<Map<String, String>> authenticate(@RequestBody Subject subject) { Map<String, String> result = new HashMap&

无法调用spring REST服务

我的春季服务

@RequestMapping(value = "/MAS/authenticate", method = RequestMethod.POST)
public ResponseEntity<Map<String, String>> authenticate(@RequestBody Subject subject) {
    Map<String, String> result = new HashMap<String, String>();
    result.put("result_detail", "Invalid Password");
    result.put("result", "failure");
    HttpHeaders responseHeaders = new HttpHeaders();
    responseHeaders.setContentType(MediaType.APPLICATION_JSON);
    responseHeaders.add("Access-Control-Allow-Origin", "*"); // also added header to allow cross domain request for any domain
    return new ResponseEntity<Map<String, String>>(result, responseHeaders, HttpStatus.OK);
}
我遇到以下错误:(

已阻止跨源请求:同源策略不允许在读取远程资源。可以通过将资源移动到同一域或启用CORS来修复此问题

我也尝试了
数据类型:“jsonp”
。它将我的body对象附加到URL中,这会产生不同的URL,并且当时无法命中我的服务URL,结果出现404错误

我的浏览器:firefox 36.0.4


如何摆脱此错误,有什么帮助吗?

默认情况下,唯一允许的方法是
get
,您不允许在服务器端发布
POST

Access-Control-Allow-Origin: *
此标题仅启用CORS,但您需要添加以下内容:

Access-Control-Allow-Methods: POST, GET
关于Mozilla项目

所以你的代码应该是这样的:

responseHeaders.add("Access-Control-Allow-Methods", "POST, GET"); // also added header to allow POST, GET method to be available
responseHeaders.add("Access-Control-Allow-Origin", "*"); // also added header to allow cross domain request for any domain
更新

我重新阅读了这篇文章,发现了一些细节:

一个简单的跨站点请求是:

  • 仅使用GET、HEAD或POST。如果POST用于将数据发送到 服务器,使用HTTP发送到服务器的数据的
    内容类型
    POST请求是application/x-www-form-urlencoded, 多部分/表单数据,或文本/普通。
  • 不使用设置自定义标题 HTTP请求(如X-Modified等)
您可以用粗体阅读,必须为数据设置其他
内容类型
(当前为
contentType:“application/json;charset=utf-8”,
)或使用后面介绍的飞行前技术:

  • 它使用GET、HEAD或POST以外的方法 发送内容类型不是的请求数据 application/x-www-form-urlencoded、多部分/表单数据或text/plain, e、 g.如果POST请求使用 application/xml或text/xml,则请求被预引导
  • 它在请求中设置自定义标头(例如,请求使用诸如 X射线(其他)
因此,我建议您要么更改contentType,要么尝试在请求中使用此标题:

Access-Control-Request-Headers: X-HEADER_NAME_OF_YOUR_CHOOSE
并将此标题添加到您的响应中:

Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: X-HEADER_NAME_OF_YOUR_CHOOSE

然后你可以试着调用你的方法。

我的AJAX调用和服务还可以。在互联网上搜索了很多之后,我发现它的服务器端问题不是客户端问题

在Spring的服务器端,我们必须实现允许CORS请求的过滤器

过滤器将如下所示

import java.io.IOException;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.filter.OncePerRequestFilter;

public class CORSFilter extends OncePerRequestFilter {
    private static final Log LOG = LogFactory.getLog(CORSFilter.class);

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {

        response.addHeader("Access-Control-Allow-Origin", "*");
        if (request.getHeader("Access-Control-Request-Method") != null && "OPTIONS".equals(request.getMethod())) {
            LOG.trace("Sending Header....");
            // CORS "pre-flight" request
            response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
            // response.addHeader("Access-Control-Allow-Headers", "Authorization");
            response.addHeader("Access-Control-Allow-Headers", "Content-Type");
            response.addHeader("Access-Control-Max-Age", "1");
        }
        filterChain.doFilter(request, response);
    }

}
在web.xml中,对您的服务请求应用此筛选器,如下所示

    <filter>
        <filter-name>cors</filter-name>
        <filter-class>com.test.common.controller.CORSFilter</filter-class> <!-- your package name and filter class -->
    </filter>
    <filter-mapping>
        <filter-name>cors</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping> 

科尔斯
com.test.common.controller.CORSFilter
科尔斯
/*

这可能有助于解决此问题的其他人。

以下是跨平台spring boot web服务调用的解决方案

应用程序URL:

Web服务URL:

在spring控制器中,使用以下注释

@CrossOrigin(origins = "http://localhost:8080")
@RequestMapping(value = "/uri", method = RequestMethod.GET)
public SomeObject someMethod(){
// your logic will come here
}

你在使用哪台服务器?@Halayem Anis:我在使用webSphere,但也在tomcat上试用过。在服务中的“Access Control Allow Methods”和“POST,get”上出现相同的错误,但仍然出现相同的错误:(更新了答案,尝试阅读原始文章并尝试他们的解决方案。非常感谢您的回复,我尝试了您的其他建议,但无法摆脱此错误:(
@CrossOrigin(origins = "http://localhost:8080")
@RequestMapping(value = "/uri", method = RequestMethod.GET)
public SomeObject someMethod(){
// your logic will come here
}