当前位置: 首页 > 面试题库 >

跨域请求阻止的Spring REST服务+ AJAX

楚宏胜
2023-03-14
问题内容

无法致电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);
}

我的AJAX代码

$.ajax(
{
  crossDomain: true,
  type: "POST",
  contentType: "application/json; charset=utf-8",
  async: false,
  url: "http://localhost:8080/SpringMVC/rest/MAS/authenticate",
  headers: {"Access-Control-Allow-Origin" : "*"},
  data:{},
  dataType: "json", //also tried "jsonp"
  success: function(data, status, jqXHR)
  {
    alert('success');
  },
  error: function(jqXHR, status)
  {
    alert('error');
  }
});

我收到以下错误:(

跨域html" target="_blank">请求被阻止:同源策略禁止读取位于http:// localhost:8080 / SpringMVC / rest / MAS /
authenticate
的远程资源。可以通过将资源移到同一域或启用CORS来解决此问题。

我也尝试过dataType: "jsonp"。它将我的body对象附加到URL中,URL变为不同的URL,然后无法访问我的服务URL,并得到404错误。

我的浏览器:firefox 36.0.4

我如何摆脱这个错误,有什么帮助吗?


问题答案:

我的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>

这可能会帮助遇到此问题的其他人。:)



 类似资料:
  • 问题内容: 因此,我有了这个Go http处理程序,该处理程序将一些POST内容存储到数据存储中,并检索其他一些信息作为响应。在后端,我使用: 在我的firefox OS应用程序中,我使用: 传入的部分都一直如此。但是,我的回复被阻止了。给我以下信息: 我尝试了许多其他操作,但是无法从服务器获得响应。但是,当我将Go POST方法更改为GET并通过浏览器访问该页面时,我得到的数据太糟糕了。我无法真

  • 问题内容: 如何通过Ajax从远程URL获取内容? jQuery ajax请求被阻止,因为跨域 控制台日志 跨域请求被阻止:“相同源策略”不允许读取http://www.dailymotion.com/embed/video/x28j5hv上的远程资源。(原因:CORS标头“ Access-Control-Allow-Origin”缺失)。 跨域请求被阻止:“相同源策略”不允许读取http://w

  • 问题内容: 所以当我尝试使用React将数据发送到后端时,我遇到了这个错误。据我了解,我需要允许后端和文件中的通信。这是我使用的一些链接: 没有“访问控制允许来源”-节点/ Apache端口问题 [Access-Control-Allow- Origin标头如何工作?]http://codingdict.com/questions/8006) 他们两个都有代码,但是没有帮助。 到目前为止,我的服务

  • 问题内容: 我正在尝试提出一个简单的跨域请求,而Firefox始终通过此错误阻止它: 跨域请求被阻止:同源策略禁止读取[url]处的远程资源。可以通过将资源移到同一域或启用CORS来解决此问题。[网址] 它可以在Chrome和Safari中正常运行。 据我所知,我已经在PHP上设置了所有正确的标头,以使其能够正常工作。这是我的服务器响应的内容 我尝试使用Angular,jQuery和基本的XMLH

  • 我也在应用程序根目录中使用。htaccess文件。(waleedahmad.kd.io/node)。

  • 在浏览器的沙箱环境下,默认只允许js代码请求其所属域的数据,不同域名/ip/协议,都默认禁止. 跨域所需要的是,是响应浏览器发起的OPTIONS,及真正的GET/POST, 共2个请求哦. 所需要的逻辑CrossOriginFilter已经封装好了 如何解决 nutz给出的方案非常简单,仅需要在入口方法上添加CrossOriginFilter即可 @Filters(@By(type=CrossO