Java SpringMVC控制器响应作为静态内容缓存在浏览器中
我希望我对SpringMVC控制器的响应在浏览器中被视为一个静态内容。只需获取一次,然后从浏览器缓存中获取,以获取未修改的状态代码。 我有普通的Spring MVC控制器,方法简单Java SpringMVC控制器响应作为静态内容缓存在浏览器中,java,spring,hibernate,spring-mvc,tiles,Java,Spring,Hibernate,Spring Mvc,Tiles,我希望我对SpringMVC控制器的响应在浏览器中被视为一个静态内容。只需获取一次,然后从浏览器缓存中获取,以获取未修改的状态代码。 我有普通的Spring MVC控制器,方法简单simpleService.getVariables()正在从数据库中获取大量内容。它返回字符串 @RequestMapping(value = "/jsContent.htm") public ModelAndView jsContent(@RequestParam("ver") String version,
simpleService.getVariables()
正在从数据库中获取大量内容。它返回字符串
@RequestMapping(value = "/jsContent.htm")
public ModelAndView jsContent(@RequestParam("ver") String version,
HttpServletRequest request, HttpServletResponse response) {
ModelAndView mav = new ModelAndView("jsContent");
mav.addObject("variables", simpleService.getVariables());
return mav;
}
响应由Apache Tiles处理。firstPart
是普通的JavaScript文件,secondPart
是添加到ModelAndView
对象的字符串
<definition name="javascript" template="/WEB-INF/tiles/javascript.jsp" />
<definition name="jsContent" extends="javascript">
<put-attribute name="firstPart" expression="/js/content/static.js" />
<put-attribute name="secondPart" expression="${variables}" />
</definition>
通过将此Spring过滤器添加到web.xml
,我只获得了304未修改的状态代码。但是,每次仍会获取内容,通过Etag
标题比较,当发生任何更改时,状态代码为304
<filter>
<filter-name>etagFilter</filter-name>
<filter-class>org.springframework.web.filter.ShallowEtagHeaderFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>etagFilter</filter-name>
<servlet-name>dispatcher</servlet-name>
</filter-mapping>
埃塔格过滤器
org.springframework.web.filter.ShallowEtagHeaderFilter
埃塔格过滤器
调度员
如何获取Spring控制器的缓存响应?我试图通过HTTP头实现这一点,但没有成功。ETag方法不适合您的需要。过滤器的工作方式是,它在每次接收到请求时调用控制器,然后计算响应的散列,将散列(ETag)与请求中发送的ETag进行比较,如果两者匹配,则过滤器假设数据没有更改,并发送没有响应主体的客户机304
如您所见,此方法不会减少实际控制器对请求所需的工作量,它只会提高带宽利用率并向客户端提供更快的响应(因为我们不发送响应正文,而只发送状态代码)
因此,对于您的情况,您应该使用上次修改的响应头和如果自
请求头修改。要使用Spring MVC实现这一点,您可以尝试以下方法:
1.在控制器中,以毫秒为单位维护时间戳,该时间戳应与资源上次修改的时间相同。我将其设置为部署时间,假设在应用程序运行时不会修改我的内容。如果您想强制浏览器加载新的副本,即使浏览器的版本较旧,您也可以根据自己的意愿选择此次更新
接受org.springframework.web.context.request.WebRequest作为控制器方法的参数
在您的方法中,仅当webRequest.checkNotModified(lastModifiedTime)
为false时,才执行实际处理
示例代码:
public class MyController {
//Injected
private long lastModifiedTime;
public void getFullSdk(WebRequest webRequest, HttpServletRequest request,
HttpServletResponse response) throws Exception {
if (webRequest.checkNotModified(lastModifiedTime)) {
return;
} else {
// real expensive code goes here
// write to response
}
}
}
希望这有帮助
public class MyController {
//Injected
private long lastModifiedTime;
public void getFullSdk(WebRequest webRequest, HttpServletRequest request,
HttpServletResponse response) throws Exception {
if (webRequest.checkNotModified(lastModifiedTime)) {
return;
} else {
// real expensive code goes here
// write to response
}
}
}