如何通过注释在spring mvc 3中设置标头无缓存
Posted
技术标签:
【中文标题】如何通过注释在spring mvc 3中设置标头无缓存【英文标题】:how to set header no cache in spring mvc 3 by annotation 【发布时间】:2011-05-20 20:39:40 【问题描述】:如何通过注解在spring mvc 3中设置header no cache?不是
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
【问题讨论】:
好问题,虽然我怀疑没有办法用注释来做到这一点(还) 为什么选择不直接设置响应头而是使用拦截器,我认为这对性能不友好? 【参考方案1】:没有这样的选择。您可以使用拦截器:
<mvc:annotation-driven/>
<mvc:interceptors>
<bean id="webContentInterceptor"
class="org.springframework.web.servlet.mvc.WebContentInterceptor">
<property name="cacheSeconds" value="0"/>
<property name="useExpiresHeader" value="true"/>
<property name="useCacheControlHeader" value="true"/>
<property name="useCacheControlNoStore" value="true"/>
</bean>
</mvc:interceptors>
(取自here)
一方面,没有这样的注释是合乎逻辑的。 spring-mvc 方法上的注解主要是让容器决定调用哪个方法(通过请求头、请求 url 或方法来限制)。控制响应不属于这一类。
另一方面 - 是的,拥有这些会很方便,因为当控制器进行单元测试时,它与测试 http 标头内容无关(或者是吗?)。还有@ResponseBody
和@ResponseStatus
,它们确实指定了一些响应属性。
【讨论】:
啊,是的。好吧,也许我的推理并不完全正确:) 只是评论这仍然适用于 Spring webmvc 4。这样一个有用、简单的解决方案。 在 Spring 4.2 中你必须使用 setCacheSeconds(0) 和 setCacheControl(CacheControl.noStore())【参考方案2】:要覆盖某些控制器映射的设置,请使用 WebContentInterceptor 上的 cacheMappings 属性对象
<bean id="webContentInterceptor"
class="org.springframework.web.servlet.mvc.WebContentInterceptor">
<property name="cacheSeconds" value="2100" />
<property name="useExpiresHeader" value="true" />
<property name="useCacheControlHeader" value="true" />
<property name="useCacheControlNoStore" value="true" />
<property name="cacheMappings">
<props>
<prop key="/myUncachedController">0</prop>
</props>
</property>
【讨论】:
【参考方案3】:我知道这是旧的,但这可能对某些人有帮助。
如果您想在缓存时和不缓存时添加更多逻辑,您还可以编写自定义拦截器。
例如,如果您只想在浏览器为 IE 或仅来自特定 url 时禁用响应中的缓存,您也可以通过扩展 HandlerInterceptor 接口来实现。
通过这样做,您可以对发生的事情有很大的控制权。这并不像一次为所有内容设置标题或只是在每个控制器中输入对响应的更改那么容易,但它也不是那么难,并且在我看来是一个更好的长期解决方案。春季一般知道怎么做也是一件好事。
这是一个很好的教程:
http://www.mkyong.com/spring-mvc/spring-mvc-handler-interceptors-example/
【讨论】:
以上是关于如何通过注释在spring mvc 3中设置标头无缓存的主要内容,如果未能解决你的问题,请参考以下文章
在 Spring Reactive 中使用 application.properties 在请求标头中设置 Content-type
如何在Swift中设置UIWebView的“User-Agent”标头