猿问

如何在使用 angular7 和 springboot 构建的 Web 应用程序中使浏览器缓存无效

我正在使用 springboot 为后端服务 rest API 和 Angular7 为前端开发一个 Web 应用程序。


我的应用程序需要很长时间才能加载,因为它必须在服务器上执行大量处理,所以我决定通过存储缓存数据来提高性能,以便首先加载页面并最终在处理结束时更新数据。


这可行,但我遇到了一个问题:当我在 Angular 中更新数据时,这些数据通常保存在我的数据库中,但如果我更新页面,我看不到更改,因为浏览器继续访问旧的缓存数据而不是获取新的修改。


有没有办法在修改浏览器缓存中的某些数据时使其无效?


弹簧靴:


我的休息控制器端点类似于:


  @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');

  }


开满天机
浏览 63回答 2
2回答

慕容森

我可以看到您正在服务器端进行缓存,您可以通过调用使用@CacheEvict您要驱逐的密钥注释的方法来驱逐缓存:@CacheEvict(value = "users", allEntries = true)或者您可以使用以下方式以编程方式执行此操作CacheManager:@AutowiredCacheManager cacheManager;public void evictSingleCacheValue(String cacheName, String cacheKey) {&nbsp; &nbsp; cacheManager.getCache(cacheName).evict(cacheKey);}

函数式编程

您可以通过轻量级请求检查服务器端基于时间或基于内容的控件是否有任何更改。基于时间 => 您可以在标题中使用 Last=Modified基于内容 => 你可以使用 Etag请检查这两个链接;&nbsp;https://devcenter.heroku.com/articles/increasing-application-performance-with-http-cache-headershttps://www.logicbig.com/quick-info/web/last-modified-and-if-modified-since.html
随时随地看视频慕课网APP

相关分类

Java
我要回答