bboss mvc控制器实现etag和last modify两种http缓存机制

简介: bboss mvc控制器实现etag和last modify两种http缓存机制(本文参考《聊聊高并发系统之HTTP缓存》编写) 1.缓存控制器实现 缓存控制器的类文件: HttpCache.
bboss mvc控制器实现etag和last modify两种http缓存机制(本文参考《 聊聊高并发系统之HTTP缓存》编写)

1.缓存控制器实现
缓存控制器的类文件:
HttpCache.java
实现etag和last modify两种http缓存机制方法分别如下:

last modify
public ResponseEntity<String> cache( 
		      //为了方便测试,此处传入文档最后修改时间
		      @RequestParam(name="millis") long lastModifiedMillis,
		      //浏览器验证文档内容是否修改时传入的Last-Modified If-Modified-Since
		      @RequestHeader (name = "If-Modified-Since", required = false,dateformat="EEE, d MMM yyyy HH:mm:ss.SSS 'GMT'",locale = "en_US") Date ifModifiedSince) {

		    //当前系统时间
		    long now = System.currentTimeMillis();
		    //文档可以在浏览器端/proxy上缓存多久
		    long maxAge = 20;

		    //判断内容是否修改了,此处使用等值判断
		    if(ifModifiedSince != null && ifModifiedSince.getTime() == lastModifiedMillis) {
		        return new ResponseEntity<String>(HttpStatus.NOT_MODIFIED);
		    }

		    DateFormat gmtDateFormat = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss.SSS 'GMT'", Locale.US);
		    System.out.println(System.currentTimeMillis());
		    String body = "<a href=''>点击访问当前链接</a>";
		    MultiValueMap<String, String> headers = new HttpHeaders();

		    //文档修改时间
		    headers.add("Last-Modified", gmtDateFormat.format(new Date(lastModifiedMillis)));
		    //当前系统时间
		    headers.add("Date", gmtDateFormat.format(new Date(now)));
		    //过期时间 http 1.0支持
		    headers.add("Expires", gmtDateFormat.format(new Date(now + maxAge)));
		    //文档生存时间 http 1.1支持
		    headers.add("Cache-Control", "max-age=" + maxAge);
		    return new ResponseEntity<String>(body, headers, HttpStatus.OK,"String");
		}

etag
public ResponseEntity<String> etgcache( 
		      //浏览器验证文档内容的实体 If-None-Match
		      @RequestHeader (name = "If-None-Match", required = false) String ifNoneMatch) {

		    //当前系统时间
		    long now = System.currentTimeMillis();
		    //文档可以在浏览器端/proxy上缓存多久
		    long maxAge = 10;

		    String body = "<a href=''>点击访问当前链接</a>";

		    //弱实体
		    String etag = "W/\"" + DigestUtils.md5DigestAsHex(body.getBytes()) + "\"";

		    if(ifNoneMatch != null &&  ifNoneMatch.equals(etag)) {
		        return new ResponseEntity<String>(HttpStatus.NOT_MODIFIED);
		    }

		    DateFormat gmtDateFormat = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss 'GMT'", Locale.US);
		    MultiValueMap<String, String> headers = new HttpHeaders();

		    //ETag http 1.1支持
		    headers.add("ETag", etag); 
		    //当前系统时间
		    headers.add("Date", gmtDateFormat.format(new Date(now)));
		    //文档生存时间 http 1.1支持
		    headers.add("Cache-Control", "max-age=" + maxAge);
		    return new ResponseEntity<String>(body, headers, HttpStatus.OK);
		}


运行和访问实例
启动示例应用之前,必须先安装好gradle并配置好gradle环境变量,至少 gradle 3.0+ (Complete distribution)版本
从github下载源码工程:
git clone -b master --depth 1 https://github.com/bbossgroups/bestpractice.git
切换到在命令行,进入源码目录
cd bestpractice

执行gradle指令
gradle :mvc:tomcatStart

启动成功后访问示例:
etag
http://localhost:8080/mvc/caches/etgcache.page
Last-Modified
http://localhost:8080/mvc/caches/cache.page?millis=1473172518546

目录
相关文章
|
6月前
|
缓存 并行计算 PyTorch
PyTorch CUDA内存管理优化:深度理解GPU资源分配与缓存机制
本文深入探讨了PyTorch中GPU内存管理的核心机制,特别是CUDA缓存分配器的作用与优化策略。文章分析了常见的“CUDA out of memory”问题及其成因,并通过实际案例(如Llama 1B模型训练)展示了内存分配模式。PyTorch的缓存分配器通过内存池化、延迟释放和碎片化优化等技术,显著提升了内存使用效率,减少了系统调用开销。此外,文章还介绍了高级优化方法,包括混合精度训练、梯度检查点技术及自定义内存分配器配置。这些策略有助于开发者在有限硬件资源下实现更高性能的深度学习模型训练与推理。
1092 0
|
3月前
|
存储 网络协议 安全
HTTP 协议及会话跟踪机制详解
本文详解了 HTTP 协议的核心知识,包括其定义(超文本传输协议,基于 TCP,规定客户端与服务器通信规则)及与 HTTPS 的区别(安全性、端口、资源消耗)。 介绍了 GET 与 POST 请求的差异(参数限制、安全性、应用场景),以及 Restful 风格(通过 URL 定位资源,请求方式决定操作)。列举了常见 HTTP 状态码(如 200 成功、404 资源未找到),对比了转发与重定向的区别(服务器端一次请求 vs 客户端两次请求)。 还阐述了会话跟踪机制:Cookie 基于客户端存储,通过Set-Cookie和Cookie头实现,安全性较低;Session 基于服务端存储,依赖 C
255 1
|
3月前
|
JSON 前端开发 Java
Spring MVC 核心组件与请求处理机制详解
本文解析了 Spring MVC 的核心组件及请求流程,核心组件包括 DispatcherServlet(中央调度)、HandlerMapping(URL 匹配处理器)、HandlerAdapter(执行处理器)、Handler(业务方法)、ViewResolver(视图解析),其中仅 Handler 需开发者实现。 详细描述了请求执行的 7 步流程:请求到达 DispatcherServlet 后,经映射器、适配器找到并执行处理器,再通过视图解析器渲染视图(前后端分离下视图解析可省略)。 介绍了拦截器的使用(实现 HandlerInterceptor 接口 + 配置类)及与过滤器的区别
236 0
|
缓存 Java 数据库连接
mybatis复习05,mybatis的缓存机制(一级缓存和二级缓存及第三方缓存)
文章介绍了MyBatis的缓存机制,包括一级缓存和二级缓存的配置和使用,以及如何整合第三方缓存EHCache。详细解释了一级缓存的生命周期、二级缓存的开启条件和配置属性,以及如何通过ehcache.xml配置文件和logback.xml日志配置文件来实现EHCache的整合。
mybatis复习05,mybatis的缓存机制(一级缓存和二级缓存及第三方缓存)
|
8月前
|
存储 缓存 分布式计算
【赵渝强老师】Spark RDD的缓存机制
Spark RDD通过`persist`或`cache`方法可将计算结果缓存,但并非立即生效,而是在触发action时才缓存到内存中供重用。`cache`方法实际调用了`persist(StorageLevel.MEMORY_ONLY)`。RDD缓存可能因内存不足被删除,建议结合检查点机制保证容错。示例中,读取大文件并多次调用`count`,使用缓存后执行效率显著提升,最后一次计算仅耗时98ms。
174 0
【赵渝强老师】Spark RDD的缓存机制
|
11月前
|
存储 缓存 监控
后端开发中的缓存机制:深度解析与最佳实践####
本文深入探讨了后端开发中不可或缺的一环——缓存机制,旨在为读者提供一份详尽的指南,涵盖缓存的基本原理、常见类型(如内存缓存、磁盘缓存、分布式缓存等)、主流技术选型(Redis、Memcached、Ehcache等),以及在实际项目中如何根据业务需求设计并实施高效的缓存策略。不同于常规摘要的概述性质,本摘要直接点明文章将围绕“深度解析”与“最佳实践”两大核心展开,既适合初学者构建基础认知框架,也为有经验的开发者提供优化建议与实战技巧。 ####
|
10月前
|
缓存 Java 数据库连接
深入探讨:Spring与MyBatis中的连接池与缓存机制
Spring 与 MyBatis 提供了强大的连接池和缓存机制,通过合理配置和使用这些机制,可以显著提升应用的性能和可扩展性。连接池通过复用数据库连接减少了连接创建和销毁的开销,而 MyBatis 的一级缓存和二级缓存则通过缓存查询结果减少了数据库访问次数。在实际应用中,结合具体的业务需求和系统架构,优化连接池和缓存的配置,是提升系统性能的重要手段。
386 4
|
10月前
|
缓存 Java 数据库连接
MyBatis缓存机制
MyBatis提供两级缓存机制:一级缓存(Local Cache)默认开启,作用范围为SqlSession,重复查询时直接从缓存读取;二级缓存(Second Level Cache)需手动开启,作用于Mapper级别,支持跨SqlSession共享数据,减少数据库访问,提升性能。
158 1
|
11月前
|
前端开发 Java 开发者
Spring MVC中的控制器:@Controller注解全解析
在Spring MVC框架中,`@Controller`注解是构建Web应用程序控制层的核心。它不仅简化了控制器的定义,还提供了灵活的请求映射和处理机制。本文将深入探讨`@Controller`注解的用法、特点以及在实际开发中的应用。
720 0
|
存储 缓存 负载均衡
Nginx代理缓存机制
【10月更文挑战第2天】
302 4