1.nginx反向代理
1.1修改nginx配置 nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65; # 保持连接的超时时间
server {
listen 80; # 监听端口号
server_name localhost; # 监听地址
location / {
# 配置后端服务的代理
proxy_pass http://localhost:8090;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 添加跨域相关的响应头
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
add_header Access-Control-Allow-Headers "Authorization, Origin, X-Requested-With, Content-Type, Accept";
add_header Access-Control-Allow-Credentials "true";
# 针对复杂请求的预检请求
if ($request_method = 'OPTIONS') {
add_header Content-Length 0;
add_header Content-Type 'text/plain; charset=utf-8';
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'Authorization, Origin, X-Requested-With, Content-Type, Accept';
return 204;
}
}
}
}
1.2修改host文件(可选)
一般位置在 C:\Windows\System32\drivers\etc\hosts
2.过滤器解决跨域问题
本质上是采用同源策略
@Component
public class CorsFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
HttpServletRequest request = (HttpServletRequest) req;
response.setHeader("Access-Control-Allow-Origin", "http://example.com");
response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
response.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
response.setHeader("Access-Control-Max-Age", "3600");
if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
response.setStatus(HttpServletResponse.SC_OK);
} else {
chain.doFilter(req, res);
}
}
@Override
public void init(FilterConfig filterConfig) {}
@Override
public void destroy() {}
}
3.使用WebMvcConfigurer解决跨域问题
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("Content-Type", "*")
.maxAge(3600); // 设置响应有效期
}
}
4.SpringCloudGateway 解决跨域问题
在yml文件中配置
spring:
cloud:
gateway:
httpclient:
connect-timeout: 60000
response-timeout: 80s
# 配置跨域
globalcors:
cors-configurations:
'[/**]':
allowedOrigins: '*'
allowedMethods: '*'
allowedHeaders: '*'
allowCredentials: true
add-to-simple-url-handler-mapping: true
如果还不行那就使用注解试下吧【哭】
@RestController
public class MyController {
@CrossOrigin(origins = "需要解决跨域的地址")
@GetMapping("/api/data")
public String getData() {}
}