- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试使用 CookieJar 将已保存的身份验证 cookie 添加到进一步的请求中。虽然获取正确的身份验证 cookie 并将其保存到 jar 中效果很好,但在检查 response.request().headers()
时,找不到 cookie。
我发现这特别奇怪,因为我通过调试发现为请求调用了 loadForRequest()
并返回了正确的 cookie。当在 Postman 中使用完全相同的 cookie 来伪造请求时,它会返回所需的结果(没有登录表单的页面)。
有人可以解释一下我遗漏了什么吗?
使用jar的类
class HTMLRoutes {
var scheme = "https"
var host = "www.mangaupdates.com"
val cookieJar = MULoginCookieJar()
var client = OkHttpClient.Builder()
.cookieJar(cookieJar)
.build()
/*Other code*/
private fun getHTMLFromUrl(url: HttpUrl): String {
var request = Request.Builder()
.url(url)
.build()
client.newCall(request).execute().use { response ->
//Right before returning response the loadForRequest() method gets called in the MUCookieJar class
if (response.isSuccessful) {
//response.request.headers = ""
if (response.body() != null) {
return response.body()!!.string()
} else {
throw IOException("Response body is empty")
}
} else {
throw IOException("Unexpected code" + response)
}
}
}
}
我的 cookies jar
class MULoginCookieJar : CookieJar {
private var secureSessionCookie: Cookie? = null
override fun saveFromResponse(url: HttpUrl?, cookies: MutableList<Cookie>?) {
if (url != null && cookies != null) {
if (url.pathSegments().size > 0 && url.pathSegments()[0] == "login.html") {
for (cookie in cookies) {
if(cookie.name() == "secure_session") {
secureSessionCookie = cookie
}
}
}
}
}
override fun loadForRequest(url: HttpUrl?): List<Cookie>? { // url = https://www.mangaupdates.com/series.html?id=14829
if(url != null && url.pathSegments().size > 0 && url.pathSegments()[0] == "login.html") {
return emptyList()
}
val cookies: List<Cookie> = if(secureSessionCookie==null) emptyList() else listOf(secureSessionCookie!!)
return cookies // = ["secure_session=601bbc74; expires=Sun, 07 Oct 2018 20:45:24 GMT; domain=www.mangaupdates.com; path=/; secure; httponly"]
}
}
非常感谢您的帮助。我潜伏了很长时间,但这是我第一次被问题难住。
最佳答案
我建议使用现有的 cookie jar 而不是创建自己的 cookie jar。有关 cookie 的规则可能会变得有点复杂。
import okhttp3.JavaNetCookieJar;
CookieManager cookieManager = new CookieManager();
cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
JavaNetCookieJar cookieJar = new JavaNetCookieJar(cookieManager);
OkHttpClient client = new OkHttpClient.Builder().cookieJar(cookieJar).build();
还可以设置 OkHttp debug logging with an interceptor 来帮助调试.
Logger logger = LoggerFactory.getLogger(HttpUtil.class);
HttpLoggingInterceptor logging =
new HttpLoggingInterceptor((msg) -> {
logger.debug(msg);
});
logging.setLevel(Level.BODY);
client.addNetworkInterceptor(logging);
关于java - OkHttp CookieJar 向请求添加 cookie 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46718693/
我正在学习 Python 并使用 Requests Lib。我想使用 CookieJar 来存储 cookie,但我找不到如何将响应的 Cookie 添加到现有 CookieJar: CookieJa
在 Mechanize 方面,我们有: 方法:set_cookiejar() 但是,当我们说 mechanize 具有自动 cookie 处理时,为什么我们仍然需要一个 cookie jar ? 请帮
我有一个带有 CookieJar 的对象,我想对其进行 pickle。 然而,正如你们可能都知道的那样,pickle 会阻塞包含锁定对象的对象。由于某些可怕的原因,CookieJar 有一个锁定对象。
CookieJar 似乎将 cookie 保存在内存之外的某个地方,但我无法在文档中找到这些详细信息。那么 CookieJar 在哪里保存 cookie?有没有办法更改 cookie 的持久保存位置?
如何像以下代码一样从 Mojo 中的文件加载 cookie: my $mech = WWW::Mechanize->new(); $mech->cookie_jar(HTTP::Cookies->ne
我在使用 python 将 cookie 放入字典时遇到了一些问题。即使在运行请求提供的命令后,似乎也以某种方式转义了。 resp = requests.get(geturl, cookies=coo
我在从 cookiejar 中检索 cookie 时遇到问题。 我正在尝试使用请求库,我想检索特定的 cookie,但我不知道如何去做。 也许你们中的某个人比我更有经验,或者对 Python2.7 了
我尝试像这样 pickle CookieJar 对象: import cookielib import pickle dumpFile = open('cookie.dump','w') cj = c
在 PHP Curl 的情况下,当我们需要在网络抓取方面存储/读取 cookie 时,感觉那里的许多资源都鼓励使用带有这些选项的文件来处理 cookie curl_setopt($ch, CURLOP
我正在尝试使用 urllib2 和 cookiejar 登录网站。它保存了 session ID,但是当我尝试打开另一个需要身份验证的链接时,它说我没有登录。我做错了什么? 这是代码,对我来说失败了:
如何在 python 中创建一个 cookie 并将其添加到 CookieJar 实例?我有 cookie 的所有信息(名称、值、域、路径等),但我不想使用 http 请求提取新的 cookie。 我
我在 Linux Slackware 13.0 和 python 2.6.2 上运行 SUDS 0.4。当我使用这段代码调用 SOAP 方法时: from suds.client import Cli
我正在使用 Python Requests 库来发出 HTTP 请求。我从服务器获取一个 cookie 作为文本。如何把它变成一个带有 cookie 的 CookieJar? 最佳答案 Request
我知道我可以遍历 cookiejar 中的 cookie,这将允许我找到具有特定名称的 cookie - 但是 CookieJar 对象本身是否有任何我可以调用的方法来按名称获取某个 cookie?
今天我遇到了“cookiejar”一词(包net/http/cookiejar)。我试图收集一些关于它的信息,但没有得到任何可以理解的信息。我知道 cookie 是服务器发送给客户端的键/值对,例如:
我有一个网站抓取工具运行了很长时间,没有任何问题。最近,我相信该网站进行了更改,并且我现在遇到了 session 持久性问题。这是创建我的浏览器的代码: def create_browser(): #
我知道基础数据结构是HashSet,但是为什么get方法可以使用&str类型而不是cookie结构? cargo.toml [dependencies] cookie = "0.14" src/mai
我正在尝试设计一种方法,可以从 http.Client 获取 cookie,存储原始 cookie 数据,然后稍后将原始 cookie 转换为 *http.Cookie,然后将其添加到 http 。
我有一个 CookieJar 实例,我想从其内容中获取格式正确的 Cookie: HTTP header 。 我查看了 Python 模块源代码,但它总计约 3/4 函数和 20 sloc,我正在寻找
我正在使用以下基于 this answer 的代码将身份验证 cookie 存储在文件中。这使我可以避免每次运行该程序时都必须登录。 现在,从常规 session cookie 中获取 csrftok
我是一名优秀的程序员,十分优秀!