如何在春季绕过CORS?

时间:2019-08-18 09:53:08

标签: spring-boot

我使用RestTemplate创建应用程序-Spring Boot中的API客户端。 API(不是我的)可能有CORS,请在控制台中获取403,但在浏览器/邮递员中可以。 如何绕过CORS?

public Pokemontcg getPokemontcg() {
    RestTemplate restTemplate = new RestTemplate();
    Pokemontcg forObject = restTemplate.getForObject("https://api.pokemontcg.io/v1/cards?name=charizard", Pokemontcg.class);
    return forObject;
}

结果

  

“主要” org.springframework.web.client.HttpClientErrorException $ Forbidden:403 Forbidden

3 个答案:

答案 0 :(得分:0)

有很多同意。最有效的方法之一是 在JavaConfig

中进行
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**");
    }
}

或者最简单的方法是 控制器方法CORS配置 启用CORS很简单–只需添加注释@CrossOrigin。

我们可以通过多种不同的方式实现这一目标。

@CrossOrigin@RequestMapping-Annotated处理程序方法上

@RestController
@RequestMapping("/account")
public class AccountController {

    @CrossOrigin
    @RequestMapping("/{id}")
    public Account retrieve(@PathVariable Long id) {
        // ...
    }

如果您要使用客户端解决方案,则为解决方案

请考虑以下示例。

您的服务器是my-server.com,您的客户端是my-client.com。按以下步骤配置nginx

// nginx.conf

upstream server {
    server my-server.com;
}

upstream client {
    server my-client.com;
}

server {
    listen 80;

    server_name my-website.com;
    access_log /path/to/access/log/access.log;
    error_log /path/to/error/log/error.log;

    location / {
        proxy_pass http://client;
    }

    location ~ /server/(?<section>.*) {
        rewrite ^/server/(.*)$ /$1 break;
        proxy_pass http://server;
    }
}

此处my-website.com将是可在其中访问代码的网站的最终名称(代理网站的名称)。以这种方式配置nginx之后。您将需要修改以下请求:

All API calls change from my-server.com/<API-path> to my-website.com/server/<API-path>

答案 1 :(得分:0)

哦,您有一个完全不同的问题。您的代码还不错。

阅读此线程https://github.com/simonprickett/allthepokemon/issues/1

请将此端点更改为http://pokeapi.salestock.net/api/v2/

如果这也无济于事,请使用https://cors.now.sh/https://your_URL

https://cors.now.sh启用反向代理,并且绝对URL绝对可以使用。

这是一个很奇怪的解决方案,但事实就是如此。

答案 2 :(得分:0)

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;


@Component

public class SimpleCORSFilter implements Filter {

private final Logger log = LoggerFactory.getLogger(SimpleCORSFilter.class);

public SimpleCORSFilter() {
    log.info("SimpleCORSFilter init");
}

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;

    response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
    response.setHeader("Access-Control-Allow-Credentials", "true");
    response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With, remember-me");

    chain.doFilter(req, res);
}

@Override
public void init(FilterConfig filterConfig) {
}

@Override
public void destroy() {
}

}