`
jinnianshilongnian
  • 浏览: 21504220 次
  • 性别: Icon_minigender_1
博客专栏
5c8dac6a-21dc-3466-8abb-057664ab39c7
跟我学spring3
浏览量:2418708
D659df3e-4ad7-3b12-8b9a-1e94abd75ac3
Spring杂谈
浏览量:3008820
43989fe4-8b6b-3109-aaec-379d27dd4090
跟开涛学SpringMVC...
浏览量:5639508
1df97887-a9e1-3328-b6da-091f51f886a1
Servlet3.1规范翻...
浏览量:259935
4f347843-a078-36c1-977f-797c7fc123fc
springmvc杂谈
浏览量:1597334
22722232-95c1-34f2-b8e1-d059493d3d98
hibernate杂谈
浏览量:250226
45b32b6f-7468-3077-be40-00a5853c9a48
跟我学Shiro
浏览量:5858970
Group-logo
跟我学Nginx+Lua开...
浏览量:702014
5041f67a-12b2-30ba-814d-b55f466529d5
亿级流量网站架构核心技术
浏览量:785228
社区版块
存档分类
最新评论

不同工具(jsoup、httpclient)获取多个同路径下同名Cookie的问题

 
阅读更多

这两天在iteye的问答中有一个【java中使用jsoup获取cookies】问题, 地址:http://www.iteye.com/problems/87415

 

不知大家遇到类似的问题吗,希望一起探讨。


1、首先第一次访问http://www.17sct.com/city.php?ename=CHANGZHOU,我们可以看到如下请求:


我们看到 设置了两个 99a0_city cookie, 值分别为1 和 269;如chrome、firefox、ie8将选择最后一个作为cookie值。

 

好像没什么问题,接下来继续看两个工具:

1、jsoup

 

        Connection conn = Jsoup.connect("http://www.17sct.com/city.php?name=CHANGZHOU");
    	conn.method(Method.GET);
    	conn.followRedirects(false);
    	Response response = conn.execute();
    	System.out.println(response.cookies());
    	//{referer=deleted, 99a0_city=1, PHPSESSID=b5rjkoq2s2qmukjf9n2ffvjvn5}
    	//立即过期的也显示出了,即从服务器传过来的都显示

 

  99a0_city竟然为1,即选择了第一个作为cookie的值。

 

查看并修改org.jsoup.helper.HttpConnection中获取cookie的代码:

 

            // headers into map
            Map<String, List<String>> resHeaders = conn.getHeaderFields();
            
            for (Map.Entry<String, List<String>> entry : resHeaders.entrySet()) {
                String name = entry.getKey();
                if (name == null)
                    continue; // http/1.1 line

                List<String> values = entry.getValue();

                if (name.equalsIgnoreCase("Set-Cookie")) {
                    for (String value : values) {
                        TokenQueue cd = new TokenQueue(value);
                        String cookieName = cd.chompTo("=").trim();
                        String cookieVal = cd.consumeTo(";").trim();
                        // ignores path, date, domain, secure et al. req'd?
                        System.out.println(cookieName+"="+cookieVal);
                        cookie(cookieName, cookieVal);
                    }
                } else { // only take the first instance of each header
                    if (!values.isEmpty())
                        header(name, values.get(0));
                }
            }

 

 

conn是java.net.HttpURLConnection,也就是说如果使用HttpURLConnection时 有多个同名的cookie 将获取第一个作为cookie的值。

 

2、HttpClient,和浏览器行为一样获取最后一个Cookie:

 

    	HttpClient client = new HttpClient();
    	GetMethod get = new GetMethod("http://www.17sct.com/city.php?ename=CHANGZHOU");
    	get.setFollowRedirects(false);
    	client.executeMethod(get);
    	System.out.println(Arrays.toString(client.getState().getCookies()));
    	//[PHPSESSID=cn74fv516879pv26h5lbaf9gd0, 99a0_city=269]
    	//立即过期的不显示出来
 

 

 

因此总结:

1、使用java.net.HttpURLConnection的工具/框架,如果多个同路径下同名的cookie将获取第一个

2、使用apache HttpClient,和浏览器行为一样获取最后一个。

 

 

因此,当我们在使用cookie时,尽量保证服务器设置一个cookie。

 

 

还要注意:

 

1、使用java.net.HttpURLConnection的工具/框架,可能获取到过期的cookie,如之前的referer[过期时间是2011年,即立即过期];

2、使用apache HttpClient,不会获取到过期的cookie。

 

不知大家遇到类似的问题吗,希望一起探讨。

11
5
分享到:
评论
7 楼 tss0823 2014-08-29  
分析的很好。赞!
6 楼 jinnianshilongnian 2012-09-13  
waitlonely2011 写道
这里httpclient用的get方法是httpclient3里的吧?在httpclient4的httpget方法中如何防止转向?

没研究过 应该是类似的
5 楼 waitlonely2011 2012-09-13  
这里httpclient用的get方法是httpclient3里的吧?在httpclient4的httpget方法中如何防止转向?
4 楼 jinnianshilongnian 2012-08-27  
飞天奔月 写道
对jsoup 也有研究啊

我jsoup  没有用过 cookie


简单用过 内部通过java.net.HttpURLConnection来请求的。
3 楼 飞天奔月 2012-08-27  
对jsoup 也有研究啊

我jsoup  没有用过 cookie

2 楼 jinnianshilongnian 2012-08-22  
snowolf 写道
是个问题。。。。。

嗯  今天在问答频道解答遇到的 很细节。。。。
1 楼 snowolf 2012-08-22  
是个问题。。。。。

相关推荐

    Java爬虫Jsoup+httpclient获取动态生成的数据

    本文主要讲述如何利用Java编程语言中的Jsoup库和HttpClient工具包来获取和解析动态生成的数据,特别是那些通过JavaScript动态加载的数据。 ### Java爬虫基础 Java爬虫是指使用Java语言编写的一类程序,这些程序...

    jsoup+httpclient+jar包

    HttpClient与JSoup结合使用,可以实现更高级的网页访问和数据获取。 **结合使用JSoup和HTTPClient** 将JSoup与HTTPClient结合,可以创建一个高效且灵活的网页爬虫。首先,HTTPClient负责发起HTTP请求,获取网页的...

    jsoup httpclient 爬取网页并下载google图标

    标题中的“jsoup httpclient 爬取网页并下载google图标”揭示了这个项目或教程是关于使用Java的两个著名库——Jsoup和HttpClient,来实现网页抓取并下载特定资源,这里是Google的图标。Jsoup是一个用于处理实际世界...

    httpClient采集jsoup解析

    HttpClient可以设置Cookie和User-Agent来模拟浏览器行为,而Jsoup则可以通过执行JavaScript来处理动态加载的内容。同时,为了避免被目标网站封禁,应合理控制请求频率,并可能需要使用代理IP。 总的来说,...

    jsoup+httpclient j简单爬虫

    JSoup 提供了方便的 API 用于解析 HTML 文档,而 HttpClient 则是 Apache 开源组织提供的一个用于执行 HTTP 请求的强大工具。本文将深入探讨如何结合这两者构建一个简单的 Java 爬虫。 首先,我们需要理解 **JSoup*...

    httpClient+jsoup 抓取网页数据

    实际操作时,可能还需要考虑登录、分页、动态加载等问题,这些可以通过HttpClient设置cookie和处理重定向,或者使用Jsoup的Jsoup.connect模拟JavaScript执行来解决。 总之,HttpClient和Jsoup是Java开发者进行网页...

    jsoup+httpclient

    为了更好地理解,这里提供一个简化的示例代码片段,演示如何使用JSoup和HttpClient获取网页内容: ```java CloseableHttpClient httpClient = HttpClients.createDefault(); HttpGet httpGet = new HttpGet(...

    html dom jsoup httpclient

    在给定的文件列表中,`httpclient-4.3.4.jar`就是这个库的特定版本。使用HttpClient,开发者可以编写代码来发送GET、POST等各种类型的HTTP请求,接收响应,处理cookies,甚至处理HTTP缓存。 HttpCore 是HttpClient...

    Jsoup+httpclient 模拟登陆和抓取

    Jsoup+httpclient 模拟登录和抓取知识点: 1. Jsoup库使用介绍: - Jsoup是一个Java的HTML解析器,能够直接解析HTML文档,提供类似于jQuery的操作方法。 - 主要功能包括从URL、文件或字符串中解析HTML,使用DOM或...

    java爬虫需要的jsoup包和httpclient包.rar

    在这个压缩包文件中,包含了两个关键的库:Jsoup和Httpclient,它们是Java爬虫开发中常用的工具。 **Jsoup** 是一个Java库,设计用于处理实际世界的HTML。它提供了非常方便的API,用于提取和操作数据,使用DOM、CSS...

    jsoup爬虫获取某网站的信息

    使用jsoup技术连接网站地址,通过改变参数获取网站div模块下的所有信息。通过hibernate技术保存到mysql数据库。项目中包括dbutil链接数据库的工具类,执行sql的helper工具类,获取网站div图片保存到本地的工具类信息...

    Jsoup+httpclient模拟登陆和抓取页面.pdf

    Jsoup+httpclient模拟登陆和抓取页面.pdf

    爬虫:httpclient+jsoup

    在IT领域,网络爬虫是一种自动化程序,用于从...总之,HttpClient和Jsoup是Java爬虫开发中的两个强大工具,它们结合使用能有效地抓取和解析网页信息。理解它们的工作原理和用法,对于构建高效的网络爬虫至关重要。

    httpclient 获取技术博客列表

    “工具”标签则表明HttpClient作为一个常用的开发工具,被用于日常编程任务中。 压缩包里的文件名似乎代表了一些技术资源网站的页面,比如: 1. IBM_China_technology.html - 可能是IBM中国技术网站的一个页面,...

    HttpClient和jsoup架包

    在实际应用中,HttpClient可以用于数据抓取、API调用、自动化测试等多个场景。以下是一个简单的HttpClient使用示例: ```java CloseableHttpClient httpClient = HttpClients.createDefault(); ...

    Jsoup1.11.1+HTTPClient4.5.3的最新全部jar包

    Jsoup和HTTPClient是Java开发中常用的两个库,它们分别用于处理HTML解析和网络请求。 首先,Jsoup是一个Java库,设计用于提取和操作结构化的HTML数据。它提供了类似于jQuery的API,使得开发者可以方便地查找、遍历...

    httpClient和jsoup整合,支持 HTTP 协议的客户端编程工具包

    本文将详细介绍如何将HttpClient与Jsoup整合,以便在进行网络请求时获取并解析网页数据。 HttpClient是Apache软件基金会的一个开源项目,提供了全面的HTTP协议支持,包括标准方法(GET、POST等)、连接管理、重定向...

    HttpClient Jsoup爬取天气预报

    HttpClient是Apache基金会开发的一款强大的HTTP...总的来说,HttpClient和Jsoup的结合使用,为Java开发者提供了一个强大且灵活的工具,可以方便地获取和解析网页数据,对于进行数据抓取和分析的项目来说非常实用。

    Jsoup解析Html获取新闻列表

    假设新闻列表存在于`&lt;ul class="news-list"&gt;`下的`&lt;li&gt;`元素中,每个新闻条目包含标题(`&lt;h3&gt;`)和链接(`&lt;a&gt;`)。我们可以这样解析: ```java Elements newsList = doc.select("ul.news-list li"); for ...

    httpClient+jsoup抓取网页数据实例和jar包

    在IT领域,网络爬虫是获取网页数据的重要手段,而HttpClient和Jsoup是两种常用的Java库,用于实现这一目的。HttpClient提供了低级别的HTTP通信能力,而Jsoup则是一个解析和操作HTML文档的强大工具。本教程将详细介绍...

Global site tag (gtag.js) - Google Analytics