Регистрация сервисного работника с помощью Angular и Spring Boot 2

#angular #spring-boot #angular-service-worker

#angular #spring-boot #angular-service-worker

Вопрос:

У нас есть приложение, которое работает на Spring Boot 2. Большая часть нашего сайта построена с использованием Angular 7. Теперь наш сценарий немного отличается, потому что вместо отправки файлов Angular dist на сервер мы используем Spring Boot 2 для обслуживания файлов производственной сборки из angular,

Итак, наш конвейер генерирует файлы производственной сборки Angular (main.js , vendor.js и т.д. и т.п.) И мы копируем их в нашу целевую папку Spring Boot, упаковываем ее и развертываем.

Это означает, что, хотя я регистрирую service worker с помощью @angular/service-worker пакета, мы обслуживаем его с помощью spring boot.

Таким образом, в конечном итоге файлы service worker отправляются из js/dist папки, т.е: https://shop.domain.com/js/dist/ngsw-worker.js

Итак, я нормально регистрирую service worker из /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 я регистрирую следующий веб-фильтр

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-заголовок переопределяет это.
Но даже если я укажу это, ошибка продолжает возникать.

Любая помощь была бы высоко оценена.

Комментарии:

1. Ваш код отлично сработал для меня. Как я полагаю, вы уже поняли, проблема заключается в области видимости.