Java小程序-删除/忽略所有cookie(JSoup)
我编写了一个Java小程序,它从单个主机的多个页面获取HTML内容,并从中提取数据。我使用Jsoup,它工作得很好,但它会自动在浏览器中为该主机集使用cookies,并在后续请求中发送新设置的cookies。(我相信这是由Java本地完成的) 我希望它在运行小程序时忽略服务器设置的所有cookie,并忽略浏览器可能已经拥有的任何cookie 我的代码非常简单Java小程序-删除/忽略所有cookie(JSoup),java,applet,jsoup,Java,Applet,Jsoup,我编写了一个Java小程序,它从单个主机的多个页面获取HTML内容,并从中提取数据。我使用Jsoup,它工作得很好,但它会自动在浏览器中为该主机集使用cookies,并在后续请求中发送新设置的cookies。(我相信这是由Java本地完成的) 我希望它在运行小程序时忽略服务器设置的所有cookie,并忽略浏览器可能已经拥有的任何cookie 我的代码非常简单 String url = "http://example.com/my/web-page.html"; Document document
String url = "http://example.com/my/web-page.html";
Document document = Jsoup.connect(url).userAgent("<hard-coded static value>").get();
// Extract data from document with org.Jsoup.nodes.Document.select(), etc.
stringurl=”http://example.com/my/web-page.html";
Document Document=Jsoup.connect(url.userAgent(“”.get());
//使用org.Jsoup.nodes.document.select()等从文档中提取数据。
这在多个URL中重复,所有URL都具有相同的主机(example.com)
总之,我基本上希望它:
提前感谢:)您应该操作
org.jsoup.Connection.Request
来实现以下目的:
String url = "http://example.com/my/web-page.html";
Connection con = Jsoup.connect(url).userAgent("<hard-coded static value>");
...
con.get();
...
Request request = con.request();
Map<String, String> cookies = request.cookies();
for(String cookieName : cookies.keySet()) {
//filter cookies you want to stay in map
request.removeCookie(cookieName);
}
stringurl=”http://example.com/my/web-page.html";
Connection con=Jsoup.connect(url.userAgent)(“”);
...
con.get();
...
请求=con.Request();
映射cookies=request.cookies();
对于(字符串cookieName:cookies.keySet()){
//筛选您要留在地图中的Cookie
request.removeCookie(cookieName);
}
您还应该禁用followRedirects
,并手动执行重定向(删除cookie)。
您必须实现自己的“Cookie/域移除器”
JSoup
在内部使用java.net.HttpURLConnection
,您无法截获在org.JSoup.helper.HttpConnection.Response.execute(…)
上实际调用execute
方法的核心功能,因为它是静态的,并且具有包保护的访问权限。您也不能在HttpConnection
中设置req
(请求私有对象)和res
(响应私有对象)。此外,您不能实现自己的org.jsoup.Connection
(或者由于private
构造函数而扩展其实现HttpConnection
),请添加强制jsoup以使用它
考虑到以上所有我的建议-使用HttpClient/HtmlUnit-因为你最终会在受限环境中“重新发明轮子”。而不是使用
连接(从Jsoup.connect(“url”);
方法返回的结果),使用响应
Map<String, String> cookies = new HashMah<String, String>();
Response res = Jsoup
.connect("url")
.cookies(cookies)
.userAgent("userAgent")
.method(Method.GET) //Or whatever method needed be
.execute();
Map cookies=new HashMah();
响应res=Jsoup
.connect(“url”)
.饼干(饼干)
.userAgent(“userAgent”)
.method(method.GET)//或任何需要的方法
.execute();
我知道这是一条很大的生产线,但这会很好。不知道Jsoup是否处理cookie管理。ApacheHttpClient有一个很好的cookie管理api。您可以使用它获取页面并将页面发送给jsoup进行解析;相反foreach确实是在浪费时间和处理。如果你看看它是如何实现的,你会发现HttpConnection.cookies(null)
将不起作用,因为它不能null
:(Validate.notNull(cookies,“Cookie映射不能为null”);for(map.Entry条目:cookies.entrySet(){
)的确!我的错误。你应该使用空白映射,如map cookies=new HashMap();在发布此问题之前,我尝试了完全相同的方法(包括请求和响应),但我没有注意到任何差异。它不起作用。我想这是因为cookies()方法不会替换Cookie,它只会从映射中添加Cookie,因此将空映射传递给它不会有任何作用,或者至少我是这么认为的。我想我确实需要使用HttpClient。不过,非常感谢您的努力。