当前位置: 首页 > 面试题库 >

如何使用jsoup维护可变cookie和会话?

冯亮
2023-03-14
问题内容
public boolean isGood(String path)
{
    if (p != path)
    {
        good = false;
    }

    if (good)
    {
        try 
        {
            Connection connection = Jsoup.connect(path);
            Map<String, String> cookys = Jsoup.connect(path).response().cookies();

            if (cookys != cookies)
                cookies = cookys;

            for (Entry<String, String> cookie : cookies.entrySet()) 
            {
                connection.cookie(cookie.getKey(), cookie.getValue());
            }

            Doc = connection.get();
            good = true;
        }
        catch (Exception e) 
        {
            rstring = e.getMessage().toString();
            good = false;
        }
    }
    else
    {
        try
        {
            Response response = Jsoup.connect(path).execute();
            cookies = response.cookies();
            Doc = response.parse();
            good = true;
        }
        catch (Exception e) 
        {
            rstring = e.getMessage().toString();
            good = false;
        } 
    }       
    return good;
}

此方法不正确。我试图找出的是一种不知道将存在哪些cookie,能够处理cookie更改以及维护会话的方法。

我正在为我的简单机器论坛编写一个应用程序,当您单击某些自定义行为时,它会更改其cookie配置。

但是,如果该应用程序对我的网站运行良好,我将发布一个供其他论坛使用的版本。

我知道我朝着正确的方向前进,但是逻辑有点像在踢我的屁股。

任何建议将不胜感激。


问题答案:

这段代码很混乱。流是不合逻辑的,并且异常处理不好。对象引用比较喜欢if (p != path)if (cookys != cookies)不作任何绝对的意义。要比较对象的 内容, 您需要改用equals()method。

到目前为止,我了解到您想在同一域中的一系列后续Jsoup请求中维护cookie。在这种情况下,您需要 基本上 遵循以下流程:

Map<String, String> cookies = new HashMap<String, String>();

// First request.
Connection connection1 = Jsoup.connect(url1);
for (Entry<String, String> cookie : cookies.entrySet()) {
    connection1.cookie(cookie.getKey(), cookie.getValue());
}
Response response1 = connection1.execute();
cookies.putAll(response1.cookies());
Document document1 = response1.parse();
// ...

// Second request.
Connection connection2 = Jsoup.connect(url2);
for (Entry<String, String> cookie : cookies.entrySet()) {
    connection2.cookie(cookie.getKey(), cookie.getValue());
}
Response response2 = connection2.execute();
cookies.putAll(response2.cookies());
Document document2 = response2.parse();
// ...

// Third request.
Connection connection3 = Jsoup.connect(url3);
for (Entry<String, String> cookie : cookies.entrySet()) {
    connection3.cookie(cookie.getKey(), cookie.getValue());
}
Response response3 = connection3.execute();
cookies.putAll(response3.cookies());
Document document3 = response3.parse();
// ...

// Etc.

可以将其重构为以下方法:

private Map<String, String> cookies = new HashMap<String, String>();

public Document get(url) throws IOException {
    Connection connection = Jsoup.connect(url);
    for (Entry<String, String> cookie : cookies.entrySet()) {
        connection.cookie(cookie.getKey(), cookie.getValue());
    }
    Response response = connection.execute();
    cookies.putAll(response.cookies());
    return response.parse();
}

可以用作

YourJsoupWrapper jsoupWrapper = new YourJsoupWrapper();

Document document1 = jsoupWrapper.get(url1);
// ...

Document document2 = jsoupWrapper.get(url2);
// ...

Document document3 = jsoupWrapper.get(url3);
// ...

请注意,即将到来的Jsoup 1.6.2将带有一个新Connection#cookies(Map)方法,该方法应使该for循环在每一次都是多余的。



 类似资料:
  • 如何在restasured中设置会话属性?在我的应用程序代码中,我们有如下内容 String userId = request.getSession().getAttribute(“userid”) 如何在此处将 userId 设置为会话属性(在重新保证的测试用例中)? 如何为所有请求(多个后续请求)维护同一会话? 当我发送多个请求时,它认为每个请求都是新的,会话从服务器端失效,我想在后续调用之间

  • 问题内容: 我知道使我们的类不可变的所有基本规则,但是当有另一个类引用时,我有点困惑。我知道是否有集合而不是集合,然后我们可以利用它,然后使我们的类不可变。但是在下面的情况下,我仍然无法理解这个概念。 问题答案: 好吧,这个概念是阅读并了解JLS。在这种情况下,JLS说: final字段还允许程序员无需同步即可实现线程安全的不可变对象。即使所有线程都使用数据竞争在线程之间传递对不可变对象的引用,线

  • 我正在寻找一个持久的会话管理器,将会话保存在文件系统(如PHP)上,可以与DropWizard一起使用。我看到有一个<code>环境。getSessionHandler(),但我没有看到关于它的文档。 我可以写我自己的,但我希望有一个煮熟的饭。上面的会话句柄是我要找的吗?如何使用它?

  • 我正在尝试登录到一个网站,并获得一个页面站点的页面源后,我用java URLConnection登录到该网站。我面临的问题是我无法维护会话,所以服务器给我这个警告,不让我连接: 该系统要求使用HTTP Cookie来验证授权信息。我们的系统检测到您的浏览器已禁用HTTP Cookie,或不支持它们。有关如何正确配置浏览器以便与此系统一起使用的详细信息,请参阅浏览器中的帮助页。 这是我的源代码:

  • 问题内容: 我有一个单节点服务器,该服务器响应请求并根据主机头重定向用户。用法是静态/主站点位于www,每个用户都有自己的子域(即www.example.com和site.example.com)。路由按照site.js。 当用户未登录时,他们将被重定向到登录名。 我发现当用户重定向到其子域时,无法维护该会话。我想这是预料之中的,但我想知道是否有一种方法可以在两个子域之间维持相同的会话。 我希望如

  • 问题内容: 我试图用来刮擦需要通过登录的网站。然后,一旦我登录,便可以通过访问一个单独的网页。 第一个问题,现在被登录。我试图使用到的登录信息,但我得到的回应没有出现在被记录。 在这里,我只是转发我返回的页面,但是返回的页面仍显示登录表单,如果尝试访问另一个页面,则表示我尚未登录。 我认为我需要维护客户端会话和cookie数据,但是找不到任何资源可以帮助我了解如何做到这一点。 作为后续,我最终使用