一段代码演示http客户端缓存的几个参数

本文介绍了一个用于抓取和解析福彩双色球开奖结果的Java类。该类通过发送HTTP请求来获取网页内容,并利用HTTP头信息判断页面是否更新,以此来决定是否重新下载数据。此外,还讨论了如何利用这一机制进行客户端缓存。
以前的代码片段:

/**
*
*
* 实现获取福彩双色球的开奖号码
*/
public class ParserSSQ extends ParserSportGameHTML{
int MAX_GETDATASIZE = 5 * 1024;

public String parserLotteryHtml() throws Exception {
String ssqurl = EnvConfig.getInstance().getGAMESSQURL();

String GAMESSQ_HTTP_LAST_MODIFIED = LastSuccConfig.getInstance().GAMESSQ_HTTP_LAST_MODIFIED;
String GAMESSQ_HTTP_ETAG = LastSuccConfig.getInstance().GAMESSQ_HTTP_ETAG;

if (EnvConfig.getInstance().isGAMESSQ_USE_HTTPHEAD()){
GAMESSQ_HTTP_LAST_MODIFIED = "";
GAMESSQ_HTTP_ETAG = "";
}

String result = "";
boolean isModify = true;
StringBuffer buffer = new StringBuffer();
String HTTP_head_first = "";

issuename_ = ssqurl;
awardurl_ = ssqurl;

// System.out.println("");
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
URL url = new URL(ssqurl);
HttpURLConnection huc = (HttpURLConnection) url.openConnection();
huc.setRequestMethod("GET");
huc.setDoOutput(true);
huc.setDoInput(true);
huc.setAllowUserInteraction(false);
if (EnvConfig.getInstance().isGAMESSQ_USE_HTTPHEAD()){
System.out.println("使用HTTP_LAST_MODIFIED及HTTP_ETAG");
huc.setRequestProperty("If-Modified-Since",GAMESSQ_HTTP_LAST_MODIFIED);
huc.setRequestProperty("If-None-Match", GAMESSQ_HTTP_ETAG);
}
huc.connect();

//获取回来的流
InputStream in = huc.getInputStream();

int bytes = 0; int i = 0;
while ( (bytes = in.read()) != -1) {
buffer.append( (char) bytes);
i = i + 1;
if ( i > MAX_GETDATASIZE ) break;
}
in.close();

GAMESSQ_HTTP_LAST_MODIFIED = huc.getHeaderField("Last-Modified");
GAMESSQ_HTTP_ETAG = huc.getHeaderField("ETag");
HTTP_head_first = huc.getHeaderField(0);
huc.disconnect();

if (GAMESSQ_HTTP_LAST_MODIFIED == null) GAMESSQ_HTTP_LAST_MODIFIED = "";
if (GAMESSQ_HTTP_ETAG == null) GAMESSQ_HTTP_ETAG = "";

if (EnvConfig.getInstance().getISDEBUG() == 1) {
System.out.println("首行:"+HTTP_head_first);
System.out.println("Last-Modified:"+GAMESSQ_HTTP_LAST_MODIFIED);
System.out.println("ETag:"+GAMESSQ_HTTP_ETAG);
System.out.println("长度="+buffer.length());
//System.out.println("内容="+buffer.substring(0,buffer.length()));
}

String notModified = "Not Modified";
if (HTTP_head_first.indexOf(notModified) >= 0){
isModify = false;
}
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

if (isModify) {
if (EnvConfig.getInstance().isGAMESSQ_USE_HTTPHEAD()){
LastSuccConfig.getInstance().GAMESSQ_HTTP_ETAG = GAMESSQ_HTTP_ETAG;
LastSuccConfig.getInstance().GAMESSQ_HTTP_LAST_MODIFIED = GAMESSQ_HTTP_LAST_MODIFIED;
LastSuccConfig.getInstance().saveNewValueToFile();
}
result = GetResult(buffer);
}

ShowLogs(result);
return result ;
}



[b]应该主要到,上面的代码稍加修改,就可以应用于http客户端的缓存(先利用Head获取内容是否修改,然后再用Get获取内容)[/b]
【完美复现】面向配电网韧性提升的移动储能预布局与动态调度策略【IEEE33节点】(Matlab代码实现)内容概要:本文介绍了基于IEEE33节点的配电网韧性提升方法,重点研究了移动储能系统的预布局与动态调度策略。通过Matlab代码实现,提出了一种结合预配置和动态调度的两阶段优化模型,旨在应对电网故障或极端事件时快速恢复供电能力。文中采用了多种智能优化算法(如PSO、MPSO、TACPSO、SOA、GA等)进行对比分析,验证所提策略的有效性和优越性。研究不仅关注移动储能单元的初始部署位置,还深入探讨其在故障发生后的动态路径规划与电力支援过程,从而全面提升配电网的韧性水平。; 适合人群:具备电力系统基础知识和Matlab编程能力的研究生、科研人员及从事智能电网、能源系统优化等相关领域的工程技术人员。; 使用场景及目标:①用于科研复现,特别是IEEE顶刊或SCI一区论文中关于配电网韧性、应急电源调度的研究;②支撑电力系统在灾害或故障条件下的恢复力优化设计,提升实际电网应对突发事件的能力;③为移动储能系统在智能配电网中的应用提供理论依据和技术支持。; 阅读建议:建议读者结合提供的Matlab代码逐模块分析,重点关注目标函数建模、约束条件设置以及智能算法的实现细节。同时推荐参考文中提及的MPS预配置与动态调度上下两部分,系统掌握完整的技术路线,并可通过替换不同算法或测试系统进一步拓展研究。
先看效果: https://pan.quark.cn/s/3756295eddc9 在C#软件开发过程中,DateTimePicker组件被视为一种常见且关键的构成部分,它为用户提供了图形化的途径来选取日期与时间。 此类控件多应用于需要用户输入日期或时间数据的场景,例如日程管理、订单管理或时间记录等情境。 针对这一主题,我们将细致研究DateTimePicker的操作方法、具备的功能以及相关的C#编程理念。 DateTimePicker控件是由.NET Framework所支持的一种界面组件,适用于在Windows Forms应用程序中部署。 在构建阶段,程序员能够通过调整属性来设定其视觉形态及运作模式,诸如设定日期的显示格式、是否展现时间选项、预设的初始值等。 在执行阶段,用户能够通过点击日历图标的下拉列表来选定日期,或是在文本区域直接键入日期信息,随后按下Tab键或回车键以确认所选定的内容。 在C#语言中,DateTime结构是处理日期与时间数据的核心,而DateTimePicker控件的值则表现为DateTime类型的实例。 用户能够借助`Value`属性来读取或设定用户所选择的日期与时间。 例如,以下代码片段展示了如何为DateTimePicker设定初始的日期值:```csharpDateTimePicker dateTimePicker = new DateTimePicker();dateTimePicker.Value = DateTime.Now;```再者,DateTimePicker控件还内置了事件响应机制,比如`ValueChanged`事件,当用户修改日期或时间时会自动激活。 开发者可以注册该事件以执行特定的功能,例如进行输入验证或更新关联的数据:``...
### HTTP 缓存控制机制及其实现方法 HTTP 缓存控制通过 `Cache-Control` 头字段实现,它定义了客户端和代理如何处理缓存的行为。以下是关于其工作机制以及最佳实践的具体说明: #### 1. 基本概念 HTTP 缓存的核心目标是减少网络量并提高资源加载速度。当用户访问某一资源时,系统会优先检查本地缓存是否存在有效版本的数据。如果存在,则直接使用缓存数据;否则,向服务器发起请求以获取最新数据。 - **缓存命中**:指在缓存中找到所需数据的情况。 - **未命中**:指缓存中不存在所需数据,需从源存储(如数据库或远程服务)获取[^1]。 #### 2. Cache-Control 的常用指令及其含义 `Cache-Control` 是 HTTP 协议中的一个重要头部字段,用于指定缓存策略。以下是一些常用的指令及其作用: - **public** 允许任何中间节点(如浏览器、CDN 或其他代理)缓存响应内容。这意味着即使是敏感信息也可能被公开缓存[^2]。 - **private** 仅限于单一用户的私有缓存(通常是浏览器),不允许共享缓存保存此响应的内容。 - **no-cache** 尽管名称中有“cache”,但它实际上并不阻止缓存行为。相反,它要求每次请求前都需要重新验证缓存的有效性。换句话说,在发送新请求之前,必须确认服务器上的原始文件是否有更新。 - **no-store** 完全禁用了任何形式的持久化或临时性的存储操作。对于涉及机密信息的操作来说非常有用,因为这些数据绝不会留在磁盘上或者内存里等待后续读取。 - **max-age=<seconds>** 设置当前响应可被视作最新的最大时间段长度(单位为秒)。在此期间内无需再次查询原服务器即可继续利用已有副本作为回应给客户端的结果。 #### 3. 实现方式与代码示例 为了更好地理解上述理论知识的实际应用情况,下面提供了一个简单的 Python Flask 应用来演示如何配置不同类型的 cache-control 设置: ```python from flask import Flask, make_response app = Flask(__name__) @app.route('/public') def public_cache(): response = make_response('This is publicly cachable.') response.headers['Cache-Control'] = 'public, max-age=30' return response @app.route('/private') def private_cache(): response = make_response('This is privately cachable.') response.headers['Cache-Control'] = 'private, max-age=60' return response @app.route('/nocache') def no_cache(): response = make_response('No caching allowed without validation.') response.headers['Cache-Control'] = 'no-cache' return response if __name__ == '__main__': app.run(debug=True) ``` 在这个例子中,我们创建了三个路由分别代表三种不同的缓存策略: - `/public`: 使用公共缓存,并设置了最长有效期为30秒; - `/private`: 只能由个人终端设备单独缓存,设定时间为一分钟; - `/nocache`: 虽然可以暂时保留一份拷贝供即时展示之用,但在正式采用前仍需核实状态是否一致。 #### 4. 最佳实践建议 基于以上介绍的信息,这里总结了几条有关优化 HTTP 缓存性能的最佳做法: - 明确区分公共资源和个人专属资料之间的差异,合理选用相应的缓存模式(public vs private); - 对那些频繁变动却影响用户体验的关键页面组件实施较短生命周期管理(max-age), 同时保持静态素材较长存活期; - 避免过度依赖无条件刷新(no-store),除非确实涉及到高度保密事务; - 定期审查现有架构下的实际效果反馈,适时调整参数组合达到理想平衡点.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值