通过Angular和Spring Boot 2注册服务工作者

时间:2019-03-19 13:01:00

标签: angular spring-boot angular-service-worker

我们有一个在Spring Boot 2上运行的应用程序。我们的大多数站点都是使用Angular 7构建的。现在,我们的场景是一种不同的原因,而不是将Angular dist文件提供给我们使用Spring Boot 2来服务的服务器。来自角度的生产构建文件,

因此,我们的管道会生成Angular生产构建文件(main.js,vendor.js等),然后将它们复制到Spring Boot目标文件夹中,并打包和部署。

这意味着,尽管我使用@angular/service-worker软件包注册了服务工作者,但我们使用的是Spring Boot。

因此,最终,服务工作者文件是从js/dist文件夹提供的,即:https://shop.domain.com/js/dist/ngsw-worker.js

因此,我从/js/dist/ngsw-worker.js注册了服务工作者,并且似乎都已加载。

但是当我尝试添加到homesceen时,出现错误:

Site cannot be installed: no matching service worker detected. You may need to reload the page, or check that the service worker for the current page also controls the start URL from the manifest

与此相关的所有相关文件均从js/dist文件夹提供。像:/js/dist/manifest.webmanifest /js/dist/ngsw.json /js/dist/safety-worker.js

所以我四处阅读,发现了一个不错的标题Service-Worker-Allowed

因此,在我的Spring Boot 2应用程序中,我注册了以下WebFilter

ServiceWorkerHeaderFilter.java

package com.company.project.serviceworker;

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.annotation.WebFilter;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebFilter(urlPatterns = "/js/dist/ngsw-worker.js")
public class AddServiceWorkerSecurityHeaderFilter implements Filter {

    @Override
    public void destroy() {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain) throws IOException, ServletException {
        HttpServletResponse httpServletResponse = (HttpServletResponse) response;
        httpServletResponse.setHeader("Service-Worker-Allowed", "/");
        chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }
}

标题似乎工作正常,文件似乎正确加载。 在清单文件中,指定start_url

"start_url": "/"

我不再指定scope,因为应该使用http标头覆盖它。 但是,即使我指定了错误,错误仍然会发生。

任何帮助将不胜感激。

0 个答案:

没有答案