我使用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
答案 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() {
}
}