如何在Spring MVC中设置缓存标头?
2022-08-31 14:54:06
在基于注释的 Spring MVC 控制器中,为特定路径设置缓存标头的首选方法是什么?
在基于注释的 Spring MVC 控制器中,为特定路径设置缓存标头的首选方法是什么?
我刚刚遇到了同样的问题,并找到了框架已经提供的好解决方案。该类允许您定义默认缓存行为,以及特定于路径的覆盖(具有与其他地方相同的路径匹配器行为)。对我来说,步骤是:org.springframework.web.servlet.mvc.WebContentInterceptor
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
添加一个实例:WebContentInterceptor
<mvc:interceptors>
...
<bean class="org.springframework.web.servlet.mvc.WebContentInterceptor" p:cacheSeconds="0" p:alwaysUseFullPath="true" >
<property name="cacheMappings">
<props>
<!-- cache for one month -->
<prop key="/cache/me/**">2592000</prop>
<!-- don't set cache headers -->
<prop key="/cache/agnostic/**">-1</prop>
</props>
</property>
</bean>
...
</mvc:interceptors>
在这些更改之后,/foo 下的响应包括标头以阻止缓存,/cache/me 下的响应包含标头以鼓励缓存,/cache/不可知论下的响应不包含与缓存相关的标头。
如果使用纯 Java 配置:
@EnableWebMvc
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
/* Time, in seconds, to have the browser cache static resources (one week). */
private static final int BROWSER_CACHE_CONTROL = 604800;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry
.addResourceHandler("/images/**")
.addResourceLocations("/images/")
.setCachePeriod(BROWSER_CACHE_CONTROL);
}
}
参见:http://docs.spring.io/spring-security/site/docs/current/reference/html/headers.html
答案很简单:
@Controller
public class EmployeeController {
@RequestMapping(value = "/find/employer/{employerId}", method = RequestMethod.GET)
public List getEmployees(@PathVariable("employerId") Long employerId, final HttpServletResponse response) {
response.setHeader("Cache-Control", "no-cache");
return employeeService.findEmployeesForEmployer(employerId);
}
}
上面的代码准确地显示了您想要实现的目标。你必须做两件事。添加“最终的 HttpServletResponse 响应”作为参数。然后将标头缓存控制设置为无缓存。