`

HTTP缓存 Last-Modified 服务端实现

阅读更多

 

针对图片资源,根据http协议的缓存机制,进行了服务器更新处理,但遇到了个小问题,一直还没搞清楚的.见代码备注.

 

package com.g3net.servlet;

import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@SuppressWarnings("serial")
public class PicServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		if (!Appcontext.isstarted) {
			return;
		}
		req.setCharacterEncoding("UTF-8");
		resp.setContentType("image/png");
		String key = req.getParameter("k");
		
		long ifModifiedTime = req.getDateHeader("if-modified-since");
		/* 打印输出 浏览器 返回的if-modified-since请求头数据,均返回 1388712683000l,而非 1388712683125l ,省略了毫秒级别数据.*/
		System.out.println("ifModifiedSince:" + ifModifiedTime );
		
		long lastModifyTime = PicCahceUtil.getLastModifyTime(key);
		/* 因此这里根据modifytime进行判断时,应省去毫秒级数据再进行对比*/
		if(ifModifiedTime != -1 && ifModifiedTime != 0 && ifModifiedTime/1000 == lastModifyTime/1000){
			resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
			return;
		}
		byte[] picdata = PicCahceUtil.getPicData(key);
		if (picdata != null && picdata.length > 1) {
			resp.setStatus(HttpServletResponse.SC_OK);
			/*便于测试,下发的"修改时间"为固定值 1388712683125l */
			resp.addDateHeader("Last-Modified", 1388712683125l);
			resp.setHeader("Cache-Control", "max-age=" + 2);//表示浏览器最大缓存两天,两天内会根据modifytime进行更新处理; 超过两天则强制进行更新 
			resp.addDateHeader("Expires", System.currentTimeMillis() + 1000 * 120);//表示浏览器2分钟内不会再次请求服务器,以减少对服务器压力
			/* 下发返回值 */
			OutputStream out = resp.getOutputStream();
			try {
				out.write(picdata);
				out.flush();
			} catch (Exception e) {
				LogService.writeLog(LoggerNameType.FAILLOG, "下发图片数据出错key:"
						+ key, LogService.ERROR);
			} finally {
				out.close();
			}
			// 指标监控
			Appcontext.dataCollection.addFunctionUsingNum("pic", 1);
		} else {
			resp.sendError(HttpServletResponse.SC_NOT_FOUND);
		}
		
		
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		doGet(req, resp);
	}
	
	public static void main(String[] args) {
		long value = 1388712683100l;
		System.out.println(Long.valueOf(value));
	}

}

 

分享到:
评论

相关推荐

    Apache PHP利用HTTP缓存协议原理解析及应用

    本文将深入解析Apache和PHP如何通过HTTP缓存协议优化网站性能,重点探讨Cache-Control、Expires、Last-Modified以及Etag等关键头部字段的应用。 #### 一、Apache与静态页面缓存 对于Apache服务的静态页面,Last-...

    最新大厂前端面试题-笔试题2.doc

    2. 服务端优化:使用 CDN、expires/cache-control 强缓存、Etag/Last-modified 协商缓存、GZIP 压缩等。 3. CSS 优化:将样式表放到页面顶部、不要使用 CSS 表达式等。 4. JS 优化:将脚本放到页面底部、压缩 JS 和 ...

    http缓存知识梳理

    针对浏览器缓存,开发者可以通过设置HTTP头部来控制缓存行为,如设置Expires和Cache-Control来控制资源过期策略,使用ETag和Last-Modified来控制资源的验证机制。另外,可以借助开发者工具查看网络请求的缓存状态,...

    网站缓存核心技术

    Last-Modified: Mon, 29 Jun 1998 02:28:12 GMT ``` - **网关/代理服务器缓存**:将网页缓存至网关服务器上,多个用户访问同一页面时,可以由网关服务器直接提供页面,减少了对源服务器的请求。 #### 服务端缓存...

    HTTP 请求报头详解

    * Entity Header Fields:Allow、Content-Encoding、Content-Language、Content-Length、Content-Location、Content-MD5、Content-Range、Content-Type、Expires、Last-Modified、extension-header HTTP 报头字段是...

    浏览器缓存问题5个.docx

    此外,ETag和Last-Modified等校验机制的失效也可能导致浏览器误判缓存内容的有效性。 **解决方案**: 1. **调整HTTP缓存策略**:通过设置`Cache-Control`头部来指示浏览器何时应重新验证或下载资源。例如,设置`...

    vue服务端渲染缓存应用详解

    同时,还可以结合 HTTP 缓存策略(如 ETag 和 Last-Modified),以进一步优化服务器与客户端之间的通信。 总结来说,Vue 服务端渲染缓存的应用是提升性能和用户体验的重要手段,通过合理地管理和利用缓存,可以在...

    http 从入门到精通

    - **协商缓存:** 协商缓存主要通过`ETag`和`If-None-Match`或`Last-Modified`和`If-Modified-Since`等头部来实现。 **Cache-Control**:控制缓存的行为,常见的值包括: - **no-cache**:强制客户端在使用缓存...

    cxf webservice restful实现

    - 考虑使用缓存策略,如Etag和Last-Modified,减少不必要的请求。 - 对于高并发场景,考虑使用线程池和异步处理机制,提升服务响应速度。 - 使用GZIP压缩,减少网络传输的数据量。 6. **监控与日志**: - 集成...

    http头详解

    - **Last-Modified**:对象最后一次被修改的时间。 - **Location**:当资源被创建或移动时,服务器可以返回新的URL。 - **Server**:服务器的相关信息。 - **Expires**:资源过期的时间。 - **Age**:表示对象自其...

    让你页面速度飞起来 Web前端性能优化(视频教程+ppt)

    - **协商缓存**:利用`ETag`或`Last-Modified`实现服务器与客户端之间的缓存验证机制。 **3.2 浏览器缓存** - **Service Worker**:作为客户端的代理服务器,拦截网络请求并缓存响应数据,提供离线访问能力。 - **...

    xUtils3:Android orm,位图,http,视图注入。

    xUtils3简介 xUtils包含了orm,http,图像,视图注解,但依然很轻量级(251K),并且特性强大,方便扩展。 ...支持缓存(实现了Cache-Control,Last-Modified,ETag等特性,缓存内容过多时使用过期

    allow-cors-access-control插件.zip

    - 只有以下HTTP头部被设置:Accept、Accept-Language、Content-Language、Content-Type(仅限于application/x-www-form-urlencoded、multipart/form-data、text/plain)、Last-Modified。 - 不包含任何自定义头部...

    HTTP1.1协议规范(中文归纳版)

    - **Last-Modified Time (最后修改时间)**:资源最后修改的时间戳。 #### 三、语法定义 - **BNF (Backus-Naur Form)**:巴科斯范式,一种用于描述语言结构的形式化文法。 - `name = definition` - `rule1 | rule...

    前端性能优化与实践.zip

    1. **浏览器缓存机制**:浏览器缓存通过HTTP协议中的Cache-Control、ETag、Last-Modified等头部信息,实现对静态资源的高效复用,减少网络请求,提高页面加载速度。理解缓存策略,如强缓存和协商缓存,可以帮助...

    http://yourgame.javaeye.com/blog/252853

    接着,作者可能会讨论到HTTP优化技巧,例如减少HTTP请求次数(合并CSS和JS文件,使用雪碧图等)、使用GZIP压缩减小传输体积、缓存策略(如Last-Modified和ETag)等。这些技巧可以显著提升游戏加载速度和用户体验。 ...

    interview:fe面试

    页面性能指标: dns查询,一般500ms(使用dns缓存,20ms以内)协商缓存(last-modified,etag) tcp链接和ssl(https特殊的数据传输过程)大约200毫秒请求响应,内容传输dom解析(600ms左右)资源加载(http1.1同一...

    web前端优化方案

    可以使用ETag、Last-Modified等HTTP头部信息控制缓存,或者设置合理的Cache-Control、Expires头。 三、启用压缩 服务器端进行文件压缩(如gzip压缩),浏览器端进行文件解压,可以减少传输数据量,从而提升加载速度...

    Cookie&Session;&Cache;.zip

    1. HTTP缓存:通过HTTP响应头的`Cache-Control`、`ETag`、`Last-Modified`等字段控制浏览器缓存。 2. 服务端缓存:例如Redis、Memcached等,用于存储数据库查询结果或计算结果,减少重复计算。 3. 客户端缓存:...

Global site tag (gtag.js) - Google Analytics