如何在Spring MVC中设置缓存标头?

2022-08-31 14:54:06

在基于注释的 Spring MVC 控制器中,为特定路径设置缓存标头的首选方法是什么?


答案 1

我刚刚遇到了同样的问题,并找到了框架已经提供的好解决方案。该类允许您定义默认缓存行为,以及特定于路径的覆盖(具有与其他地方相同的路径匹配器行为)。对我来说,步骤是:org.springframework.web.servlet.mvc.WebContentInterceptor

  1. 确保我的 实例未设置“cacheSeconds”属性。org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
  2. 添加一个实例: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


答案 2

答案很简单:

@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 响应”作为参数。然后将标头缓存控制设置为无缓存。