Java 跨来源请求被阻止的弹簧休息服务+;AJAX
无法调用spring REST服务 我的春季服务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&
@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射线(其他)
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
}