当前位置: 首页 > 知识库问答 >
问题:

在与不同域通信时使用POST获得400个错误请求错误

桂梓
2023-03-14

我们有两个用于UI和服务器的项目,它们都运行在不同的域上。对于UI,我们使用angular JS,对于服务器端,我们使用spring,并向客户端提供JSON响应。由于CORS问题,我们无法与服务器通信。我们在谷歌上搜索了一下,尝试了不同的解决方案。我们找到了下面的链接。

我们确实做了链接中提到的任何事情。它适用于GET请求,但不适用于POST请求。当我们做POST请求时,我们得到了400个坏请求。请查看以下详细信息。

  1. 远程地址:IP:8080
  2. 请求URL:http://ip:8080/controller/addlogin
  3. 请求方法:POST
  4. 状态代码:400错误请求

响应头:http/1.1 400错误请求服务器:apache-coyote/1.1 access-control-allow-origin:*access-control-allow-methods:POST,GET,OPTIONS,DELETE access-control-allow-headers:Origin,x-requested-with,Content-Type,Accept Content-Type:text/html;charset=utf-8 content-language:en content-length:1113 date:Mon,28 Sep 2015 09:33:21 GMT连接:close

请求头:POST/controller/addlogin http/1.1主机:192.168.5.131:8080连接:keep-alive内容-长度:41 pragma:no-cache cache-control:no-cache接受:application/json,text/plain,/origin:localhost:1337用户-代理:mozilla/5.0(Windows NT 6.1;WOW64)appleWebkit/537.36(KHTML,像Gecko)chrome/45.0.2454.101 safari/537.36内容-类型:application/json;charset=utf-8引用:

在得到这些信息之后,我们在客户端添加了下面的行,就像我们在StacloverFlow的一些解决方案中看到的那样。但错误仍然保持不变。

  $httpProvider.defaults.useXDomain = true;
  $httpProvider.defaults.withCredentials = true;
  $httpProvider.defaults.headers.common['Access-Control-Allow-Credentials'] = true;
  delete $httpProvider.defaults.headers.common["X-Requested-With"];
  $httpProvider.defaults.headers.post['Content-type'] = "application/json";

请帮助我们解决这个问题。

更新问题:

 org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'corsFilter' is defined for enabling cors.

为了解决这个问题,我们创建了bean

<bean id="corsFilter" class="com.prototype.helper.SimpleCORSFilter" /> 

在root-context.xml文件中。但我们仍然没有运气,我们仍然收到400个坏的请求

发布http://ip address:8080/controller/addlogin 400(错误请求)。

public class SimpleCORSFilter extends OncePerRequestFilter {

 // private Set<String> whitelist = Sets.newHashSet("[AllowedOrigin1]", "[AllowedOrigin2]");

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

          String originHeaderFromClient = request.getHeader("Origin");
          response.setHeader("Access-Control-Allow-Origin", originHeaderFromClient);
          response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
          response.setHeader("Access-Control-Max-Age", "3600");
          response.setHeader("Access-Control-Allow-Headers", "x-requested-with,Authorization,Content-Type");
          filterChain.doFilter(request, response);
     }

}
    <filter>
        <filter-name>corsFilter</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>corsFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

共有1个答案

翟冷勋
2023-03-14

如果检查浏览器中的developer options中的network选项卡,您可能会看到浏览器在进行POST调用之前对服务器进行了options调用。

Spring的DispatcherServlet默认情况下阻止OPTIONS调用进入应用程序。也就是说,期权调用不会通过。您的浏览器认为您试图到达的服务器不支持CORS,因此阻止呼叫通过。

我们在web.xml中使用delegatingfilterproxy实现了一个筛选器并将其连线,如下所示:

<filter>
        <filter-name>corsFilter</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>corsFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

并在筛选器的doFilter方法中执行以下操作:

 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        String originHeaderFromClient = request.getHeader("Origin");
        response.setHeader("Access-Control-Allow-Origin", <<acceptedOrigins>>;
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with,Authorization,Content-Type");
        chain.doFilter(request, response);

这样,所有调用都将获得access-control-allow-origin头,而不考虑get/POST。它还使控制器不受CORS报头特定设置的影响(如果您有多个控制器,这是一个麻烦)。

 类似资料:
  • 通过邮递员API正在工作,但相同的API不与改造工作,我收到400个错误的改造要求 返回true或false的endpoint@POST(“/emrmegax/api/allscript/saveappointment”)调用saveappointment(@Header(“x-auth-token”)字符串header1,@Body字符串yy);

  • 我正在为一个项目使用Hackerrank API。查看官方文档,点击这里! 在他们的网站上有一个使用UNIREST的例子, 由于我使用的是axios,所以我将其转换为类似的axios代码,如下所示: 我希望这只适用于示例中所示的示例,但它给我带来了以下错误: 请求失败,状态代码为400 错误:请求失败,状态代码为400 在createError(createError.js:16) 在sett(s

  • 问题内容: 我正在尝试使用Jquery发送Ajax POST请求,但是我遇到了400错误的请求错误。 这是我的代码: 它说:无法根据请求构建资源。我想念什么? 问题答案: 最后,我弄错了,原因是我需要对发送的JSON数据进行字符串化处理。我必须在XHR对象中设置内容类型和数据类型。所以正确的版本在这里: 可能会帮助别人。

  • 我试图从一个Angular控制器执行POST操作,当我的Java RestController不需要任何参数(例如,下面的签名只是)时,它就可以工作,但是一旦我告诉它需要一个参数,并试图在Angular的POST请求中发送它,它就会失败,出现。是否需要做一些事情来从一个角帖子中正确地发送数据?

  • 我想我会在这里问这个问题,因为我不太确定我会错在哪里。我正在尝试使用Django Rest框架类通过AJAX执行POST请求。但是,每当事件触发时,我都会收到以下错误: 这是堆栈跟踪中显示的内容: 上下文 我试图做到这一点,当用户单击“添加到列表”按钮时,它会向用户定义的列表发送一个cafeName(以及最终的其他详细信息)。 我想知道是否有人可以看看我的代码,并给我一些指导,我哪里出了问题? 代