spring中对浏览器缓存的控制

我们平常在页面发送一个url请求的时候,会通过网络去服务器获取这个资源,网速好的时候倒是没什么,但是网络差一点的话,资源获取的延时就会很长,用户体验就会大大降低。但是我们可以使用缓存来解决这个问题。

当我们请求一个资源的时候,会返回一个响应头,这时只要在响应头里加上一个过期时间,只要过期时间没有到期,浏览器就会直接读缓存,而不是重新通过网络读取这个资源。在spring中的控制器可以做到这一点。

只要在静态页面跳转的控制器加上HttpServletResponse response参数,并且设置响应头的延时时间 

	response.setDateHeader("Expires", System.currentTimeMillis()+1*60*60*1000);
     这样,第二次访问这个页面的时候,就不会重新通过这个控制器从网络中获取了,而是直接从浏览器缓存中获取,大大提高了资源的访问速度。

 浏览器在访问一个url的时候,会先访问浏览器的缓存空间,有没有这个条记录,有的话,检查时间,过期,重新读,没过期,直接从缓存拿,如果没有这条缓存记录,就访问url。但是,有些资源我们不希望浏览器从缓存中读取,比如我们平时经常用的验证码。这时只要在请求url的网址后面加上一个不会重复随机字段,浏览器就不会从缓存中读取资源了。

### 配置Spring项目中的浏览器缓存Spring项目中配置浏览器缓存可以通过多种方式实现,主要依赖于HTTP响应头来控制客户端的行为。以下是几种常见的方法: #### 方法一:通过`WebConfig`类设置全局缓存策略 可以创建一个自定义的`WebConfig`类并扩展`WebMvcConfigurer`接口,在其中重写`addResourceHandlers`方法以应用缓存控制。 ```java import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**") .addResourceLocations("classpath:/static/") .setCacheControl(CacheControl.maxAge(365, TimeUnit.DAYS).cachePublic()); } } ``` 上述代码设置了静态资源的最大缓存时间为一年,并启用了公共缓存[^1]。 #### 方法二:使用`@ControllerAdvice`拦截器设置特定控制器的缓存行为 如果希望针对某些API或路径单独设置缓存时间,则可以在拦截器或者`@ControllerAdvice`中动态修改响应头。 ```java import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class CacheController { @GetMapping("/cached-data") @Cacheable(value = "data", key = "#root.methodName") public String getCachedData() { return "This data is cached!"; } } ``` 此示例展示了如何利用Spring的`@Cacheable`注解标记某个方法的结果会被自动存储到缓存中[^2]。 #### 方法三:手动调整HttpServletResponse头部信息 对于更细粒度的需求,可以直接操作`HttpServletResponse`对象来自定义缓存指令。 ```java import javax.servlet.http.HttpServletResponse; @Controller public class CustomResponseHeaderController { @GetMapping("/custom-header") public String customHeaders(HttpServletResponse response) { long timeoutInSeconds = 86400; // One day. response.setHeader("Cache-Control", "max-age=" + timeoutInSeconds); response.setDateHeader("Expires", System.currentTimeMillis() + (timeoutInSeconds * 1000)); return "index"; } } ``` 这里我们显式地向响应添加了两个重要的字段:“Cache-Control”用于指定通用规则,“Expires”则给出了具体的过期日期。 以上三种途径都可以有效地帮助开发者管理其应用程序内的浏览器端数据保留机制,请依据实际场景选取最适合的方式加以运用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值