SpringMVC API缓存 LastModified的实现总结

SpringMVC框架核心原理与实战应用解析 SpringMVC作为Java EE领域主流的MVC框架,基于Servlet API实现了高度可配置的请求处理流程。其核心采用前端控制器模式,通过DispatcherServlet统一调度HandlerMapping、HandlerAdapter等组件,支持注解驱动开发与RESTful接口设计。在微服务架构中,SpringMVC常作为基础Web层技术,与Spring Boot深度整合后可快速构建生产级应用。本文通过解析请求处理全流程、核心注解矩阵及性能优化策略,帮助开发者掌握拦截器扩展、异步处理等关键技术, 阅读详情

      Servlet的生态中,提供了一种友好机制用来提高系统的响应速度,当客户端查询的数据在没有变化的情况下直接返回,以减少服务器压力和网络传输的压力。Spring MVC也很好的继承了该机制,下面我们就学习下怎么使用LastModified。

1.handler是实现了LastModified的Servlet

public class MyServlet extends HttpServlet{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = -2471386444207404619L;
	private static Long count= -1L;

	@Override
	public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException
	{
		System.out.println("req....");
		count= System.currentTimeMillis();
		resp.getWriter().write("hello" +count);
	}
	@Override
	public long getLastModified(HttpServletRequest req) {
        return count;
    }
}

Spring-mvc.xml配置如下:

因为handler是Servlet,所以此处使用了BeanNameUrlHandlerMapping和SimpleServletHandlerAdapter。

然后在对该请求的时候,就能在request headers中发现If-Modified-Since头信息,response中发现Last-Modified。

2.handler继承AbstractController并实现LastModified接口

public class InfoController extends AbstractController implements LastModified{

	private static Long count= -1L;
	public String test() {
		return "hello";
	}

	@Override
	protected ModelAndView handleRequestInternal(HttpServletRequest request,
			HttpServletResponse response)
			throws Exception {
		count= System.currentTimeMillis();
		response.getWriter().write("hello" +count);
		return null;
	}

	@Override
	public long getLastModified(HttpServletRequest request) {
		// TODO Auto-generated method stub
		return count;
	}
	
}

 

因为handler是Controller,所以Adapter使用了SimpleControllerHandlerAdapter。

请求的时候在request headers中发现If-Modified-Since头信息,response中发现Last-Modified。

3.handler是使用注解的@RestController,url的匹配是@requestMapping

@RestController
@RequestMapping("/info")
public class JJController 
{
	private static Long count = 0L;

	@GetMapping("/jj")
	public String test(WebRequest request) {
		if(request.checkNotModified(count)) {
			return null;
		}
		System.out.println("******************************8");
		count = System.currentTimeMillis();
		return "hello";
	}

}

为了找到对应的处理器和正确处理请求,handlerMapping和handlerAdapter的配置如上。

 但是并没有实现LastModified接口,原因,请看源码RequestMappingHandlerAdapter(由于3.2版本之后,AnnotationMethodHandlerAdapter已经不被推荐使用,替代为RequestMappingHandlerAdapter)中的描述:

我们再看看 WebRequest中关于checkNotModified方法的说明:

/**
	 * Check whether the requested resource has been modified given the
	 * supplied last-modified timestamp (as determined by the application).
	 * <p>This will also transparently set the "Last-Modified" response header
	 * and HTTP status when applicable.
	 * <p>Typical usage:
	 * <pre class="code">
	 * public String myHandleMethod(WebRequest webRequest, Model model) {
	 *   long lastModified = // application-specific calculation
	 *   if (request.checkNotModified(lastModified)) {
	 *     // shortcut exit - no further processing necessary
	 *     return null;
	 *   }
	 *   // further request processing, actually building content
	 *   model.addAttribute(...);
	 *   return "myViewName";
	 * }</pre>
	 * <p>This method works with conditional GET/HEAD requests, but
	 * also with conditional POST/PUT/DELETE requests.
	 * <p><strong>Note:</strong> you can use either
	 * this {@code #checkNotModified(long)} method; or
	 * {@link #checkNotModified(String)}. If you want enforce both
	 * a strong entity tag and a Last-Modified value,
	 * as recommended by the HTTP specification,
	 * then you should use {@link #checkNotModified(String, long)}.
	 * <p>If the "If-Modified-Since" header is set but cannot be parsed
	 * to a date value, this method will ignore the header and proceed
	 * with setting the last-modified timestamp on the response.
	 * @param lastModifiedTimestamp the last-modified timestamp in
	 * milliseconds that the application determined for the underlying
	 * resource
	 * @return whether the request qualifies as not modified,
	 * allowing to abort request processing and relying on the response
	 * telling the client that the content has not been modified
	 */
	boolean checkNotModified(long lastModifiedTimestamp);

大意就是注解方式中,一个controller会有多个方法,我们只能给每个@requestMapping的方法进行一次判断,只要传入WebRequest参数,并调用其checkNotModified(lastModified)方法,为true则return null,表示内容没有被更改过,不需要重新查询。这个方法只能是在Get或者Head请求中适用。其中的例子代码如下:

 public String myHandleMethod(WebRequest webRequest, Model model) {
      long lastModified = // application-specific calculation
       if (request.checkNotModified(lastModified)) {
        // shortcut exit - no further processing necessary
         return null;
        }
       // further request processing, actually building content
       model.addAttribute(...);
       return "myViewName";
     }

通俗易懂的图解二叉搜索树、AVL树和红黑树 搜索是一种很常见的需求,当数据较多时,如何找到目标对象时,即需要搜索查找。 那么如何快速找到目标呢,最朴素的思想就是暴力查找,一个一个对比。 显然,当数据量增大时,我们需要优化查找方法获取更快的查找速度,我们可以通过维护一个有序数组,从而实现二分查找,查找速度从O(n)降为O(longn)。 但是数组并不便于插入和删除,链表便成为了最好的选择。 既然是采用二分查找,那么不如直接按照查找的步骤维护一种数据结构,于是二叉搜索树出现了。 二叉搜索树的性质为: 若左子树不为空,则左子树上所有节点值都小于根结点值; 阅读详情

相关推荐

菜鸟-需求预测与分仓规划

通过修改模型的损失函数对问题进行求解,比其它单模型的效果好很多。

永不理解_fdu的博客 4881

Spring MVC实现HTTP协议的LastModified缓存的两种方法与原理

关于缓存方式的大概原理 首先,Spring MVC中,我们发出请求,就会返回view,而实际上这样就引出了一个问题:我的请求如果没有任何改变的话,也就是说上次请求获得的静态资源是没有变化的。此时按照Spring MVC的机制,我们仍然返回了一套静态资源。显然这样增加了服务器的负载,以及网络带宽的使用。 可能Ajax能够解决这个问题——但是我们可以使用HTTP协议...

iwts 2537

西门子1200之PID用法与控制

西门子PID加热试验

gyxgyx789的博客 6253

springmvc源码学习(十二)缓存Last-Modified

目录前言一、引入二、使用三、原理分析 前言 本文分析常用的@Controller中方法中实现Last-Modified的功能 一、引入 RequestMappingHandlerAdapter.java /** * This implementation always returns -1. An {@code @RequestMapping} method can * calculate the lastModified value, call {@link WebRequest#c..

码易的博客 430

Tinder养号防封攻略来了:最新Tinder养号流程和运营攻略

今天,我就来给大家分享一下Tinder养号的具体操作,以及针对Tinder账号被封的一些常见问题为大家做个答疑。

m0_67768117的博客 2万+

Java 开发 修改【冒险岛 079 私服】完整学习流程

第 1-2 天:环境搭建 + 运行原版 079 服务端,能正常登录游戏;第 3-4 天:纯配置文件修改,掌握倍率、属性、怪物、道具的修改,改出第一个「百倍经验私服」;第 5-10 天:Java 代码基础修改,掌握 Player/Skill/Monster 核心类的修改,实现技能无冷却、一刀秒怪、升级满属性;第 11-20 天:Java 代码进阶修改,掌握业务逻辑修改,实现死亡不掉经验、自动捡物、装备强化无失败;第 21-30 天。

萧曳丶 3889

java中lastmodified_Java File lastModified()用法及代码示例

lastModified()函数是Java中File类的一部分。该函数返回该抽象路径名最后一次修改所表示的时间。该函数返回以毫秒为单位的long值,表示文件上次修改的时间;如果文件不存在或发生异常,则返回0L。函数签名:public long lastModified()用法:long valr = file.lastModified();参数:此方法不接受任何参数。返回类型此函数返回表示文件上次...

weixin_36110344的博客 9232

【自动驾驶】控制算法(十)深度解析车辆纵向控制 | Carsim 油门刹车标定表的制作...

写在前面: ???? 欢迎光临 清流君 的博客小天地,这里是我分享技术与心得的温馨角落。???? ???? 人生如戏,我们并非能选择舞台和剧本,但我们可以选择如何演绎 ????感谢您的支持与关注,让我们一起在知识的海洋中砥砺前行~~~文章目录引言一、油门标定原理1.1 油门与速度、加速度的关系1.2 油门控制曲面模型的构建二、油门标定表的制作流程...

qq_35485206的博客 2139

Spring 源码分析衍生篇十 :Last-Modified 缓存机制

文章目录一、前言二、Last-Modify三、实现方案1. 实现 LastModified 接口1.1. 简单演示1.2. 原理分析2. 使用WebRequest#checkNotModified(long) 方法2.1. 简单演示2.2. 原理分析3. 方案修改版四、Http其他缓存方法 一、前言 本文是 Spring源码分析:Spring MVC② DispatcherServlet的初始化 的衍生文章。主要是因为本人菜鸡,在分析源码的过程中还有一些其他的内容不理解,故开设衍生篇来完善内容以学习。 二

猫吻鱼的博客 2269

车载软件架构 —— AUTOSAR Vector SIP包(三)

### 上一篇文章中介绍了AUTOSAR基础软件供应商Vector公司的开发工具链,本文将继续介绍Vector公司的AUTOSAR产品。 ### -> 1、Vector SIP包中的StartApplication ### -> 2、StartApplication如何开始使用

Soly_kun的博客 828

CNN+LSTM+Attention+DNN模型实战:pytorch搭建CNN+LSTM+Attention+DNN行车速度预测

CNN+LSTM+Attention+DNN模型实战:pytorch搭建CNN+LSTM+Attention+DNN行车速度预测

6045

Spring Web MVC中的页面缓存支持 ——跟我学SpringMVC系列

    注:本章讲的是Spring2的@Deprecated,但还是有必要提一下。跟我学SpringMVC系列。。 4.2、Controller接口   package org.springframework.web.servlet.mvc; public interface Controller { ModelAndView handleRequest(HttpS...

jinnianshilongnian的专栏 349

Android PMS——概述(一)

PMS(Package Manager Service)是 Android 操作系统的一个重要组件,它负责管理应用程序的包信息以及与应用程序的安装、卸载、权限控制等相关功能,确保应用程序的安全性和稳定性。 Android PMS 负责维护一个应用程序包的清单信息,该清单是一个 XML 文件,包含应用程序的各种元数据,例如应用程序的包名、版本号、权限要求、组件信息等。PMS通过访问该清单文件来获取应用程序的信息。 此外,Android PMS 还负责应用程序的安装和卸载。在安装应用

小旭的专栏 1666

SpringMVC源码解析之Last-Modified缓存机制

Spring MVC 支持HTTP协议的 Last-Modified 缓存机制。 支持上次修改的HTTP请求,以方便内容缓存。 相同的合同作为Servlet API中的getLastModified方法。 通过委派到org.springframework.web.servlet.HandlerAdapter.getLastModified实施。 默认情况下,任何控制器或HttpRequestHandler Spring的默认框架内可以实现此接口,以实现最后修改时间检查。 注:另类处理的实现方法有不同的最后修

JavaEdge全是干货的技术号 2501

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

请求成功得到返回数据还是走到catch_面试:SpringMVC在接收到请求后的调用细节是什么?...

分享自己在Java方面的所思所想,希望你看完之后能有更多更深入的了解本人微信公众号(jwfy的学习分享),欢迎关注~接收到一个新的请求之后,spring就会去根据请求的URL信息选择具体的代码块去执行操作,如图就是接收到一个新的请求调用图,从Tomcat开始直到把请求分发到spring中,最后到了doDispatch方法。本篇学习笔记主要就是讲一个新的请求被分发到spring中spring如何处理...

weixin_35723352的博客 971

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

调用request方法_SpringMVC:接收到请求后的调用细节,你是否清楚?

分享自己在Java方面的所思所想,希望你看完之后能有更多更深入的了解本人微信公众号(jwfy的学习分享),欢迎关注~接收到一个新的请求之后,spring就会去根据请求的URL信息选择具体的代码块去执行操作,如图就是接收到一个新的请求调用图,从Tomcat开始直到把请求分发到spring中,最后到了doDispatch方法。本篇学习笔记主要就是讲一个新的请求被分发到spring中spring如何处理...

weixin_34237703的博客 88

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

tomcat拦截请求_SpringMVC:接收到请求后的调用细节,你是否清楚?

分享自己在Java方面的所思所想,希望你看完之后能有更多更深入的了解本人微信公众号(jwfy的学习分享),欢迎关注~接收到一个新的请求之后,spring就会去根据请求的URL信息选择具体的代码块去执行操作,如图就是接收到一个新的请求调用图,从Tomcat开始直到把请求分发到spring中,最后到了doDispatch方法。本篇学习笔记主要就是讲一个新的请求被分发到spring中spring如何处理...

weixin_39565777的博客 424

基于SSM框架的校园失物招领平台:从数据库设计到前后端交互的实践解析

本文详细解析了基于SSM框架(Spring+SpringMVC+MyBatis)的校园失物招领平台开发实践,从数据库设计到前后端交互的全流程。通过SSM框架的高效整合,实现了实时信息同步、精准搜索和可视化展示等功能,解决了传统失物招领方式的信息不对称问题,为校园生活提供了便捷的数字化解决方案。

weixin_34269583的博客 414

mockmvc get请求 tm的 一直404_面试:SpringMVC在接收到请求后的调用细节是什么?

分享自己在Java方面的所思所想,希望你看完之后能有更多更深入的了解本人微信公众号(jwfy的学习分享),欢迎关注~接收到一个新的请求之后,spring就会去根据请求的URL信息选择具体的代码块去执行操作,如图就是接收到一个新的请求调用图,从Tomcat开始直到把请求分发到spring中,最后到了doDispatch方法。本篇学习笔记主要就是讲一个新的请求被分发到spring中spring如何处理...

weixin_39896839的博客 113

Last-Modified缓存机制

1)在客户端第一次输入url是,服务器端会返回内容和状态码200,表示请求成功,同时会添加一个“Last-Modified”的响应头,表示此文件在服务器上的最后更新时间; 2)客户端第二次请求此URL时,客户端会像服务器发送请求头“If-Modified-Since”,询问服务器该时间之后当前请求内容是否有被修改过,如果服务器的内容没有变化,则自动返回HTTP304状态码(只要响应头,内容为空,这

猴子哥哥的博客 5623

有关Last-Modified 与 If-Modified-Since

<br />在http中Last-Modified 与If-Modified-Since 都是用于记录页面最后修改时间的 HTTP 头信息,注意,在这 Last-Modified 是由服务器往客户端发送的 HTTP 头,另一个 If-Modified-Since是由客户端往服务器发送的头,可以看到,再次请求本地存在的 cache 页面时,客户端会通过 If-Modified-Since 头将先前服务器端发过来的 Last-Modified 最后修改时间戳发送回去,这是为了让服务器端进行验证,通过这个时间戳判

taipingliebeiluo的专栏 1万+

Spring MVC学习详解

介绍一下Spring MVC的内容。 Spring提供了构建Web应用程序的全功能MVC模块。通过策略接口,Spring高度配置,且支持多种视图技术。例如JSP,Velocity,Tiles,iText和POI等。 Spring MVC功能的实现是基于Servlet功能实现的。也就是通过实现Servlet接口的DispatcherServlet来封装核心功能的实现。如果应用程序需要处理用户输入表

AlsoCoderAlsoGeek的博客 2114

lastmodified_Java文件类long lastModified()方法(带示例)

lastmodified 文件类long lastModified() (File Class long lastModified()) This method is available in package java.io.File.lastModified(). 软件包java.io.File.lastModified()中提供了此方法。 This method is used to retu...

1788

Spring Web MVC框架(十) HTTP缓存

Spring的缓存控制类 合理利用HTTP缓存,可以提高应用程序的性能。Spring当然也对HTTP缓存提供了支持。HTTP缓存最基础的类就是org.springframework.http.CacheControl,我们可以使用该类提供的各种工厂方法来得到一个CacheControl对象,然后将它添加到各种...

weixin_33699914的博客 106

Last-Modified的缓存机制在spring中的应用

1. 在客户端第一次输入URL时,服务器端会返回内容和状态码200 ,表示请求成功,同时会添加 个“Last-Modified ”的响应头,表示此文件在服务器上的最后更新时间。 例如, Last-Modified:Wed ,4Mar2012 10:22:42 GMT”表示最后更新时间为( 2012-03-14 10:22 ) 2. 客户端第二次请求此URL时,客户端向服务器发送请求头”IιMo...

qq_36418435的博客 1169

服务端的缓存验证 Last-Modified和Etag

Last-Modified 上次修改时间 配合If-Modified-Since或者If-Unmodified-Since使用 对比上次修改时间验证资源是否需要更新 ETag 数据签名 典型做法:对资源内容进行hash计算 配合If-Match或者Id-Non-Match使用 对比资源的签名判断是否使用缓存 缓存验证流程 在浏览器和服务端设置都允许缓存策略的前提下(服务端响...

光 5265
上一篇: 【设计模式】学习之结构型 适配器模式-装饰器模式-代理模式
下一篇: 406 Not Acceptable 415 Unsupported Media Type Spring MVC consumes与produces
tony_code_2017
博客等级 码龄9年 34粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值