java - CORS 问题:从 DockerHub 拉取 Spring/MySQL 后端用于前端开发
问题描述
我已将 java/mysql 后端应用程序推送到我的私人 dockerhub。我想对此进行沙箱化,以便多个用户可以访问,并对这个应用程序进行 API 调用,因为我们想在 React 中进行一些前端浏览器开发。使用像 Postman 这样的 REST 客户端很好,但是当我们开始使用浏览器时,我们开始遇到 CORS 问题:
Access to fetch at 'http://127.0.0.1:8080/simulations/1/ratings/1' from origin 'http://localhost:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.
我的docker-compose.yml
文件如下:
version: '3'
services:
footysim-db:
restart: always
container_name: footysim-db
image: 'mysql:5.7.30'
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: football_simulation
MYSQL_USER: user
MYSQL_PASSWORD: password
ports:
- '3308:3306'
volumes:
- './initial.sql:/docker-entrypoint-initdb.d/initial.sql'
footysim-server:
restart: always
image: 'DOCKERHUB:PROJECT'
expose:
- '8080'
ports:
- '8080:8080'
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://footysim-db:3306/football_simulation?useSSL=false&allowPublicKeyRetrieval=true
SPRING_DATASOURCE_USERNAME: user
SPRING_DATASOURCE_PASSWORD: password
depends_on:
- footysim-db
在我application-properties
的 Spring Boot 中:
project.cors.allowedOrigins=http://$server_ip:3000, http://127.0.0.1:3000
我是否对配置做错了什么?
解决方案
我过去也遇到过类似的问题。虽然它与 docker 无关。作为允许 CORS 功能的解决方法,我添加了一个自定义过滤器,在其中我定义了一个特定的 API 路径以允许使用 CORS 标头。
下面的代码片段:
public class CorsFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
String path = ((HttpServletRequest) req).getServletPath();
if(path.contains("abcd- api path after contextPath ")||path.contains("abcd- api path after contextPath ")) {
HttpServletResponse response = (HttpServletResponse) res;
HttpServletRequest request = (HttpServletRequest) req;
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Headers", "*");
}
chain.doFilter(req, res);
}
@Override
public void init(FilterConfig filterConfig) {}
@Override
public void destroy() {}
}
推荐阅读
- azure-functions - 如何启用 Azure 博客触发器侦听多个容器?
- sql - SQL 语法错误 - 需要删除数据库
- c - 如何将隐式函数声明视为 CMake 错误?
- html - 如何让用户从任意位置删除画布 2D 中的对象
- java - 将 Runnable 转换为可运行的 Worker 数组
- oracle - PL/SQL 中的运算符 AND 和 OR
- php - 登录到反向代理的 php 应用程序在 SSL 上失败
- node.js - CSRF 验证失败。请求中止,nodejs
- python - snakemake 中的通配符问题
- docker - 无法理解为什么我无法在使用 docker 的 dotnetcore sdk 基础映像构建的容器内运行 ping 命令