当全局配置设置为“ *”时,跨域请求被阻止

时间:2019-01-10 17:48:27

标签: spring-boot docker cors

我具有以下结构。

我有一个运行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保持所有隔离状态

0 个答案:

没有答案