Как сделать недействительным кэш браузера в веб-приложении, созданном с помощью angular7 и springboot

#java #angular #spring-boot

#java #angular #spring-boot

Вопрос:

Я разрабатываю веб-приложение, используя springboot для серверной части, обслуживающей rest API, и Angular7 для интерфейса.

загрузка моего приложения занимает так много времени, потому что ему приходится выполнять большую обработку на сервере, поэтому я решил повысить производительность, сохранив кэшированные данные, чтобы сначала загрузить страницу и, в конечном итоге, обновить данные по окончании обработки.

Это работает, но у меня проблема: когда я обновляю данные в Angular, они обычно сохраняются в моей базе данных, но если я обновляю страницу, я не вижу изменений, потому что браузер продолжает обращаться к старым кэшированным данным, а не изменять новые.

Есть ли способ сделать недействительными определенные данные в кэше браузера при их изменении?

Springboot:

Моя конечная точка контроллера rest похожа на эту:

   @GetMapping(value = "/users")
  public Iterable<User> getAllUsers(HttpServletResponse response) {
    response.setHeader("Cache-Control", "max-age=3600");
    return this.userService.findAll());
  }
  

Мой сервис:

   @Cacheable("users")
  public Iterable<User> findAll() {
    return this.userRepository.findAll();
  }
  

Мой угловой сервис:

   getUsers(): Observable<User[]> {
    return this.http.get<User[]>(`<ip>'   '/users');
  }
  

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

1. вы можете попытаться уменьшить max-age время с 3600 секунд до разумного значения

Ответ №1:

Я вижу, что вы кэшируете на стороне сервера, вы можете удалить кеш, вызвав метод с аннотацией @CacheEvict с ключом, который вы хотите удалить:

 @CacheEvict(value = "users", allEntries = true)
  

Или вы можете сделать это программно с помощью CacheManager :

 @Autowired
CacheManager cacheManager;

public void evictSingleCacheValue(String cacheName, String cacheKey) {
    cacheManager.getCache(cacheName).evict(cacheKey);
}
  

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

1. Спасибо, это мне очень помогло, но у меня все еще есть проблема: я также использую кеш браузера, добавляя элемент управления кешем в ответ внутри контроллера, как я могу аннулировать это тоже?

2. @PatrickMazzucchetti вы пробовали устанавливать значение ключа на null ?

3. где я должен установить значение null?

Ответ №2:

Вы можете проверить, есть ли какие-либо изменения в элементах управления на основе времени или содержимого на стороне вашего сервера, с помощью облегченных запросов.

На основе времени => вы можете использовать Last = Modified в заголовке

На основе содержимого => вы можете использовать Etag

пожалуйста, проверьте эти две ссылки;https://devcenter.heroku.com/articles/increasing-application-performance-with-http-cache-headers

https://www.logicbig.com/quick-info/web/last-modified-and-if-modified-since.html