【问题标题】:How to allow cross origin request with java spring如何使用java spring允许跨源请求
【发布时间】:2018-10-17 15:40:00
【问题描述】:

我什么都试过了。我不知道该怎么做。它只是没有工作。

我实际上已经添加了“@CrossOrigin”/“@CrossOrigin(maxAge = 3600)”。

如何配置 java spring 以允许跨域请求?

这就是我的请求的样子

   $.ajax({
    crossOrigin: true,
    url: "http://localhost:80/adData",
    type: "GET",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (responseSchools) {
       //stuff
    },
    error: function (request, status, error) {
        //stuff
    }
});

Java 应用程序代码

  @GetMapping
    @CrossOrigin
    @RequestMapping(value = AD_DATA_ENDPOINT)
    public String getAdData() {
        return "wuwuwu";
    }

【问题讨论】:

  • 在我的情况下,我想在所有 GET 方法上应用跨域,我在班级级别关注@CrossOrigin(origins = "*", methods = { RequestMethod.GET }, allowedHeaders = "*")。它对我有用。您正在使用的注释很好,应该可以工作。您是否在公共仓库中有代码,以便我可以在本地执行?
  • 你必须指定origins参数或其别名value;见docs.spring.io/spring-framework/docs/current/javadoc-api/org/…
  • @ShaunakPatel 遗憾的是,这也不起作用。会不会是客户端有问题?
  • 客户?你指的是像邮递员或Nodejs应用程序这样的休息工具吗?这不需要对客户端进行任何更改。给定注释只需设置 Access-Control-Allow-Credentials and Access-Control-Allow-Origin 标头作为响应。

标签: java spring


【解决方案1】:

一个相当普通但可行的方法是从处理方法中覆盖标题:

 // remember to add an `HttpServletResponse response` parameter 
 response.setHeader("Access-Control-Allow-Origin", "*");

不过,这是针对每个处理程序的解决方案。从好的方面来说,它适用于任何和所有标头:无论 Spring 为您做什么,您始终可以在处理程序本身中覆盖它。

【讨论】:

  • 我真的没有对“响应”对象的引用。这将如何运作?
  • 您只需将它作为另一个参数添加到您的处理程序方法中。见docs.spring.io/spring/docs/current/spring-framework-reference/…。在你的情况下,getAdData(HttpServletResponse response)
  • 这种作品。我不再收到不允许跨域请求错误。但请求仍然失败。 (尽管这可能是一个完全不同的问题)
  • 在服务器日志中查找确切的错误信息,如果您自己找不到问题所在,请提出另一个问题。
  • Soooooo...我在js的错误函数中检查了{request.responseText}。它实际上有正确的响应^^ wtf为什么会失败然后如果我确实得到响应(只是在错误代码中)?
【解决方案2】:

经过大量搜索后,我找到了解决方案:

代码没有问题,因为您使用的是Cross Origin请求,所以它首先向服务器发送了OPTIONS请求。为了解决这个问题,我在服务器配置部分添加了以下代码:

.antMatchers(HttpMethod.OPTIONS, "/**").permitAll()

同时使用以下代码创建一个文件:

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
   @Override
   public void addCorsMappings(CorsRegistry registry) {
       registry.addMapping("/**");
   }
}

我相信这会解决你的问题;)

【讨论】:

    【解决方案3】:

    首先,大多数服务器允许来自任何地方的GET 请求。其次,有多种方法可以在您的服务器上处理 CORS 请求。

    • @CrossOrigin 注解(默认允许GETHEADPOST 方法)可以放置在您的控制器或控制器类上。

    • 可以使用CORS Filter,这将允许OPTIONS 请求。

    • 使用WebMvConfigurer,您可以指定您的配置。

    在此处了解更多详情:https://spring.io/guides/gs/rest-service-cors/

    【讨论】:

      【解决方案4】:

      添加下面的maven依赖

      <!-- https://mvnrepository.com/artifact/com.thetransactioncompany/cors-filter -->
      <dependency>
          <groupId>com.thetransactioncompany</groupId>
          <artifactId>cors-filter</artifactId>
          <version>2.6</version>
      </dependency>
      

      并将下面的行添加到 web.xml

      <filter>
          <filter-name>CORS</filter-name>
          <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
          <init-param>
              <param-name>cors.supportedMethods</param-name>
              <param-value>GET, POST, HEAD, PUT, PATCH, DELETE, OPTIONS</param-value>
          </init-param>
      </filter>
      <filter-mapping>
          <filter-name>CORS</filter-name>
          <url-pattern>/*</url-pattern>
      </filter-mapping>
      

      这解决了我的问题。

      【讨论】:

        猜你喜欢
        • 2018-04-27
        • 2015-10-11
        • 2015-04-15
        • 2015-06-25
        • 2019-09-21
        • 2020-07-22
        • 2012-11-03
        • 2013-04-19
        • 2018-06-19
        相关资源
        最近更新 更多