httpclient连续访问网页获取数据,是否会遇到缓存

问题描述

我用httpclient的get方法持续访问一个页面,基本上一秒发一次get请求,获取页面上面的文本,这个文本信息是会根据服务器端数据更新的。打个比方,这个信息一般为"False",一天中会有30秒变为"TRUE",我需要捕获这个"TRUE”信息。但是我发现即使服务器端更新了,我的程序获取的依然是"FALSE",并没有获取到更新的信息。我用wireshark监测,我的确是每秒发出一个get请求。那为什么会没拿到那个更新信息呢?是不是服务器设置了缓存呢,每次服务器给我的都是缓存?

解决方案

解决方案二:

解决方案三:

如果是缓存问题的话,如何解决呢?
解决方案四:

有人遇到过这个问题吗
解决方案五:

不了解帮顶!
解决方案六:

直接用socket试试这个没缓存的
解决方案七:

我用的是httpclient的类,请问这样的话socket怎么用
解决方案八:

引用2楼JavaLiver的回复:

如果是缓存问题的话,如何解决呢?

一般情况下,是服务器端缓存,或者服务器端反向代理等其它问题。不过最好需要做其它测试来进一步确认。也可以可以在请求后面增加毫无意义的动态参数来设法跳过服务器缓存。
解决方案九:

请教,能否给具体点的指导。我用Fiddler监测过我用IE浏览器持续访问这个页面的过程。在访问时,服务器并没有返回LastModified或者Etag之类的标识符。cache-control返回的类型是private。网页是用aspx.net写的。我现在在我的request里已经加入了Pragma:no-cache以及Cache_Control:no-cache,网页信息还没更新,所以目前还无法测试是否能成功。如何做进一步的测试和加动态参数?
解决方案十:

解决方案十一:

解决方案十二:

个人觉得服务器默认是不会缓存的,咱们不总喜欢说“动态页面”么?如果可能,就在服务端加些打印日志来确定服务器的数据确实刷新了。
解决方案十三:

引用8楼JavaLiver的回复:

请教,能否给具体点的指导。我用Fiddler监测过我用IE浏览器持续访问这个页面的过程。在访问时,服务器并没有返回LastModified或者Etag之类的标识符。cache-control返回的类型是private。网页是用aspx.net写的。我现在在我的request里已经加入了Pragma:no-cache以及Cache_Control:n……

StringrequestURL="xxxxxx?xxx=xxx&t="+System.currentTimeMillis();//Math.random();也行
解决方案十四:

这个问题也曾经遇过,没解决!同求解决办法
解决方案十五:

想问的是,你抓包了,那么返回的包里是不是TRUE?
解决方案:我想问的是你是从什么地方得知服务器已经变为true了?
解决方案:很简单如果有缓存的话,在url最后加个时间戳没有缓存的话,调试一下,看看变量是否有变化
解决方案:如果服务器缓存了,你通过浏览器去查也应该是false。“。但是我发现即使服务器端更新了”,这个你是怎么发现的?
解决方案:url后面加个随机数试试。。url+"&date="+newDate().getTime();
解决方案:帖子时间不短了。楼主解决了没,用的哪种办法
解决方案:遇到同样的问题,同求答案
解决方案:6.1.基本概念HttpClient的缓存机制提供一个与HTTP/1.1标准兼容的缓存层–相当于Java的浏览器缓存。HttpClient缓存机制的实现遵循责任链(ChainofResponsibility)设计原则,默认的HttpClient是没有缓存的,有缓存机制的HttpClient可以用来临时替代默认的HttpClient,如果开启了缓存,我们的请求结果就会从缓存中获取,而不是从目标服务器中获取。如果在Get请求头中设置了If-Modified-Since或者If-None-Match参数,那么HttpClient会自动向服务器校验缓存是否过期。HTTP/1.1版本的缓存是语义透明的,意思是无论怎样,缓存都不应该修改客户端与服务器之间传输的请求/响应数据包。因此,在existingcompliantclient-serverrelationship中使用带有缓存的HttpClient也应该是安全的。虽然缓存是客户端的一部分,但是从Http协议的角度来看,缓存机制是为了兼容透明的缓存代理。最后,HttpClient缓存也支持RFC5861规定的Cache-Control拓展(stale-if-error'和stale-while-revalidate`)。当开启缓存的HttpClient执行一个Http请求时,会经过下面的步骤:检查http请求是否符合HTTP1.1的基本要求,如果不符合就尝试修正错误。刷新该请求无效的缓存项。(Flushanycacheentrieswhichwouldbeinvalidatedbythisrequest.)检测该请求是否可以从缓存中获取。如果不能,直接将请求发送给目标服务器,获取响应并加入缓存。如果该请求可以从缓存中获取,HttpClient就尝试读取缓存中的数据。如果读取失败,就会发送请求到目标服务器,如果可能的话,就把响应缓存起来。如果HttpClient缓存的响应可以直接返回给请求,HttpClient就会构建一个包含ByteArrayEntity的BasicHttpResponse对象,并将它返回给http请求。否则,HttpClient会向服务器重新校验缓存。如果HttpClient缓存的响应,向服务器校验失败,就会向服务器重新请求数据,并将其缓存起来(如果合适的话)。当开启缓存的HttpClient收到服务器的响应时,会经过下面的步骤:检查收到的响应是否符合协议兼容性确定收到的响应是否可以缓存如果响应是可以缓存的,HttpClient就会尽量从响应消息中读取数据(大小可以在配置文件进行配置),并且缓存起来。如果响应数据太大,缓存或者重构消耗的响应空间不够,就会直接返回响应,不进行缓存。需要注意的是,带有缓存的HttpClient不是HttpClient的另一种实现,而是通过向http请求执行管道中插入附加处理组件来实现的。6.2.RFC-2616ComplianceHttpClient的缓存机制和RFC-2626文档规定是无条件兼容的。也就是说,只要指定了MUST,MUSTNOT,SHOULD或者SHOULDNOT这些Http缓存规范,HttpClient的缓存层就会按照指定的方式进行缓存。即当我们使用HttpClient的缓存机制时,HttpClient的缓存模块不会产生异常动作。6.3.使用范例下面的例子讲述了如何创建一个基本的开启缓存的HttpClient。并且配置了最大缓存1000个Object对象,每个对象最大占用8192字节数据。代码中出现的数据,只是为了做演示,而过不是推荐使用的配置。CacheConfigcacheConfig=CacheConfig.custom().setMaxCacheEntries(1000).setMaxObjectSize(8192).build();RequestConfigrequestConfig=RequestConfig.custom().setConnectTimeout(30000).setSocketTimeout(30000).build();CloseableHttpClientcachingClient=cachingHttpClients.custom().setCacheConfig(cacheConfig).setDefaultRequestConfig(requestConfig).build();HttpCacheContextcontext=HttpCacheContext.create();HttpGethttpget=newHttpGet("http://www.mydomain.com/content/");CloseableHttpResponseresponse=cachingClient.execute(httpget,context);try{CacheResponseStatusresponseStatus=context.getCacheResponseStatus();switch(responseStatus){caseCACHE_HIT:System.out.println("Aresponsewasgeneratedfromthecachewith"+"norequestssentupstream");break;caseCACHE_MODULE_RESPONSE:System.out.println("Theresponsewasgenerateddirectlybythe"+"cachingmodule");break;caseCACHE_MISS:System.out.println("Theresponsecamefromanupstreamserver");break;caseVALIDATED:System.out.println("Theresponsewasgeneratedfromthecache"+"aftervalidatingtheentrywiththeoriginserver");break;}}finally{response.close();}6.4.配置有缓存的HttpClient继承了非缓存HttpClient的所有配置项和参数(包括超时时间,连接池大小等配置项)。如果需要对缓存进行具体配置,可以初始化一个CacheConfig对象来自定义下面的参数:Cachesize(缓存大小).如果后台存储支持,我们可以指定缓存的最大条数,和每个缓存中存储的response的最大size。Public/privatecacheing(公用/私有缓存).默认情况下,缓存模块会把缓存当做公用的缓存,所以缓存机制不会缓存带有授权头消息或者指定Cache-Control:private的响应。但是如果缓存只会被一个逻辑上的用户使用(和浏览器饿缓存类似),我们可能希望关闭缓存共享机制。Heuristiccaching(启发式缓存)。即使服务器没有明确设置缓存控制headers信息,每个RFC2616缓存也会存储一定数目的缓存。这个特征在HttpClient中默认是关闭的,如果服务器不设置控制缓存的header信息,但是我们仍然希望对响应进行缓存,就需要在HttpClient中打开这个功能。激活启发式缓存,然后使用默认的刷新时间或者自定义刷新时间。更多启发式缓存的信息,可以参考Http/1.1RFC文档的13.2.2小节,13.2.4小节。Backgroundvalidation(后台校验)。HttpClient的缓存机制支持RFC5861的stale-while-revalidate指令,它允许一定数目的缓存在后台校验是否过期。我们可能需要调整可以在后台工作的最大和最小的线程数,以及设置线程在回收前最大的空闲时间。当没有足够线程来校验缓存是否过期时,我们可以指定排队队列的大小。6.4.存储介质默认,HttpClient缓存机制将缓存条目和缓存的response放在本地程序的jvm内存中。这样虽然提供高性能,但是当我们的程序内存有大小限制的时候,这就会变得不太合理。因为缓存的生命中期很短,如果程序重启,缓存就会失效。当前版本的HttpClient使用EhCache和memchached来存储缓存,这样就支持将缓存放到本地磁盘或者其他存储介质上。如果内存、本地磁盘、外地磁盘,都不适合你的应用程序,HttpClient也支持自定义存储介质,只需要实现HttpCacheStorage接口,然后在创建HttpClient时,使用这个接口的配置。这种情况,缓存会存储在自定义的介质中,但是youwillgettoreuseallofthelogicsurroundingHTTP/1.1complianceandcachehandling.一般来说,可以创建出支持任何键值对指定存储(类似JavaMap接口)的HttpCacheStorage,用于进行原子更新。最后,通过一些额外的工作,还可以建立起多层次的缓存结构;磁盘中的缓存,远程memcached中的缓存,虚拟内存中的缓存,L1/L2处理器中的缓存等。网上找的,不知道是否可以解决你的问题,供参考
解决方案:引用楼主JavaLiver的回复:

我用httpclient的get方法持续访问一个页面,基本上一秒发一次get请求,获取页面上面的文本,这个文本信息是会根据服务器端数据更新的。打个比方,这个信息一般为"False",一天中会有30秒变为"TRUE",我需要捕获这个"TRUE”信息。但是我发现即使服务器端更新了,我的程序获取的依然是"FALSE",并没有获取到更新的信息。我用wireshark监测,我的确是每秒发出一个get请求。那为什么会没拿到那个更新信息呢?是不是服务器设置了缓存呢,每次服务器给我的都是缓存?

1、源服务器增加log,每次被调用、返回值都都加在log中2、客户端也加入log,每次收到的值3、1和2进行比较
解决方案:

时间: 2024-08-01 14:07:21

httpclient连续访问网页获取数据,是否会遇到缓存的相关文章

httpwebrequest-C#获取访问网页Json数据

问题描述 C#获取访问网页Json数据 使用http://r.qzone.qq.com/cgi-bin/tfriend/friend_mngfrd_get.cgi?uin=441212678&rd=0.3932640394195914&g_tk=450427580&fupdate=1类似的代码可以返回QQ好友列表的Json数据,一个笨的办法是Ctrl+A全选复制然后粘贴到记事本中再进行进一步处理,我想让HttpWebRequest对象获取返回的数据字符串,比如({"&qu

Hibernate获取数据方式与缓存使用

Hibernate获取数据的方式有不同的几种,其与缓存结合使用的效果也不尽相同,而Hibernate中具体 怎么使用缓存其实是我们很关心的一个问题,直接涉及到性能方面. 缓存在Hibernate中主要有三个方面:一级缓存.二级缓存和查询缓存:一级缓存在Hibernate中对应 的即为session范围的缓存,也就是当session关闭时缓存即被清除,一级缓存在Hibernate中是不可配置 的部分:二级缓存在Hibernate中对应的即为SessionFactory范围的缓存,通常来讲Sessi

安卓开发获取数据的url

问题描述 安卓开发获取数据的url 请问各位安卓开发 从网上获取数据时 怎么知道url 比如我想开发一个健康食谱 怎么知道他的url借口是多少啊 小白求助 解决方案 Java URL获取数据的方式java 访问url获取数据并解析 解决方案二: 那你得去找市面上有没有开放出来的接口.或者你有这么厉害去反编译相应的APP也能拿到接口

java-如何在输入XXX/index.jsp加载网页前进入Action获取数据

问题描述 如何在输入XXX/index.jsp加载网页前进入Action获取数据 进入Index.jsp时 里面有需要从后台获取的数据然后显示,所以进入这个页面时不先到Action获取数据再跳转回来就会报错 请问怎么解决! 解决方案 写js,页面加载时就发ajax请求到后台,然后前端得到数据,写js给页面的元素赋值 解决方案二: 在struts里面配置好,在action加载完你想加载的数据之后,返回SUCCESS或者你指定的返回结果,这个时候通过配置文件自动会跳转到XXX/index.jsp 解

tomcat集群-为什么apache+tomcat搭建的负载均衡服务器集群在部署项目访问请求获取不到数据

问题描述 为什么apache+tomcat搭建的负载均衡服务器集群在部署项目访问请求获取不到数据 为什么apache+tomcat搭建的负载均衡服务器集群在部署项目后的项目路径不对呢,请求获取不到数据我是将项目设置在tomcat的根目录访问路径,输入localhost:8080即可访问到项目的首页,显示正常.Apache弄的是IP访问嘛,通过控制分配请求给集群下的tomcat服务器来访问项目,但是直接使用IP访问请求都获取不到数据,尝试通过IP/项目名也达不到效果.这是什么原因呢. 我当时是按照

HttpURLConnection获取网页源码 网址太长不能正确获取数据

问题描述 HttpURLConnection获取网页源码 网址太长不能正确获取数据 我用HttpURLConnection获取网页源码 当网址比较长的时候就无法正确连接到网页是怎么回事? 代码如下: private String getURLResponse(String urlString){ HttpURLConnection conn = null; //连接对象 InputStream is = null; String resultData = ""; try { URL u

网页 android js-手机访问网页 网页能获取手机号码、地址簿和mac地址吗

问题描述 手机访问网页 网页能获取手机号码.地址簿和mac地址吗 手机访问网页 网页能获取手机号码.地址簿和mac地址等信息吗?? 是否需要电信商提供某些接口?? 坐等大神解答

[20121227]v$datafile访问是从数据文件获取信息吗.txt

[20121227]v$datafile访问是从数据文件获取信息吗.txt 记得以前开始学习oracle的时候,被问及访问v$datafile从哪里获取信息,当时想都没想,从数据文件.虽然当时对方并没有告诉答案,显然认为水平不再同一档次上. 直到有一次看一篇blog:http://avdeo.com/2008/05/29/oracle-database-recovery-details/ SELECT 'controlfile' "SCN location", 'SYSTEM chec

用Excel获取数据——不仅仅只是打开表格

引言:看到标题,你是否有些困惑?在Excel上具备数据获取的能力是指什么?难道不是把csv格式的表格和Excel格式的表格打开就好了吗?然而并非这样. 本文选自<数据化运营速成手册>. 其实标题中有两层意思:第一层意思是在一些数据库管理不那么严格的中小型企业,可以通过Excel中的ODBC数据接口,与数据库或者数据仓库建立连接,直接快速取数,提高工作效率:第二层意思是Excel 2016中有相当强大的数据获取工具,即便不能从数据库直接获取,也能从多个本地的数据表中将数据抽取.整理和转化,并做到