我具有以下结构。
我有一个运行tomcat 9的docker容器,其中包含2个应用程序:一个有角度的7前端,可调用api spring boot后端。 docker端口为8081,tomcat已暴露,尝试直接或通过网络访问它们都没有问题。
然后,我有一个旧版Web应用程序,与上述Docker容器在同一服务器上运行,但仅在tomcat上运行。通过标准端口访问。
我已经成功设置了所有设备,使其正常工作,我们甚至都投入生产,直到今天早上一切都很好,突然之间,当docker上的最新版本的应用程序返回“跨源请求已阻止”时,旧版应用会加载前端页面,并且该页面会尝试向API发出请求。
下面是我的心脏:
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CorsFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//do nothing
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse res = (HttpServletResponse) servletResponse;
res.setHeader("Access-Control-Allow-Origin", "*");
res.setHeader("Access-Control-Allow-Credentials", "true");
res.setHeader("Access-Control-Allow-Methods", "POST, GET, DELETE, PUT, OPTIONS");
res.setHeader("Access-Control-Allow-Headers", "Authorization, Content-Type, Accept, access-control-request-method");
res.setHeader("Access-Control-Max-Age", "3600");
if ("OPTIONS".equals(req.getMethod())) {
res.setStatus(HttpServletResponse.SC_OK);
} else {
filterChain.doFilter(servletRequest, servletResponse);
}
}
@Override
public void destroy() {
//do nothing
}
}
最近对代码所做的更改仅增加了几个额外的端点,更多的控制器及其各自的服务,在pom中添加了jasperreport依赖项,而没有其他任何事情。无需更改安全性,用户详细信息或与身份验证相关的类。所有端点都返回相同的错误。
我尝试直接在控制器类上设置@CrossOrigin批注,然后直接在控制器方法上设置,都没有成功。
我还尝试将Access-Control-Allow-Origin的值更改为'/*'
并更改为res.getHeader("Origin");
,但没有一个起作用。我现在在调试和寻找解决方案之间浪费了几个小时,但无济于事。
我还注意到服务器中的OPTIONS请求没有返回所有允许的标头,并且也缺少Access-Control-Allow-Origin = '*'
如果我在本地运行前端应用程序(使用ng serve)将请求指向服务器上的docker后端,则情况并非如此,然后一切正常。
有什么建议可行吗?
如果您想知道为什么要进行上述设置,则决定采用扼杀方法来替换旧产品,这与Coursera使用的方法非常相似。我们将在仍处于活动状态的旧产品进行替换,并使用docker保持所有隔离状态。