Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SpringMVC控制器响应作为静态内容缓存在浏览器中_Java_Spring_Hibernate_Spring Mvc_Tiles - Fatal编程技术网

Java SpringMVC控制器响应作为静态内容缓存在浏览器中

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,

我希望我对SpringMVC控制器的响应在浏览器中被视为一个静态内容。只需获取一次,然后从浏览器缓存中获取,以获取未修改的状态代码。 我有普通的Spring MVC控制器,方法简单
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
        }
    }
    }