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

HttpClient-Cookies-和JEditorPane

邹嘉致
2023-03-14
问题内容

我已经成功使用httpclient成功登录到站点,并打印出启用该登录的cookie。但是,我现在陷入困境,因为我想使用.setPage(url)函数在JEditorPane中显示后续页面。但是,当我这样做并使用Wireshark分析我的GET请求时,我看到用户代理不是我的httpclient而是以下内容:

用户代理:Java / 1.6.0_17

GET请求(在侧面jeditorpane的setPage(URL url)方法中编码)没有使用httpclient检索的cookie。我的问题是-
如何以某种方式转移通过httpclient接收到的cookie,以便我的JEditorPane可以显示该站点的URL?我开始认为这是不可能的,我应该尝试使用普通的Java
URLconnection等进行登录,但宁愿坚持使用httpclient,因为它更加灵活(我认为)。大概我还是对饼干有问题??

我曾考虑过扩展JEditorPane类并覆盖setPage(),但是我不知道应该输入的实际代码,因为似乎无法找出setPage()的实际工作方式。

任何帮助/建议将不胜感激。

戴夫


问题答案:

正如我在评论中提到的那样,HttpClient和JEditorPane用于获取URL内容的URLConnection彼此不对话。因此,HttpClient可能已获取的任何cookie都不会转移到URLConnection。但是,您可以像这样子类化JEditorPane:

final HttpClient httpClient = new DefaultHttpClient();

/* initialize httpClient and fetch your login page to get the cookies */

JEditorPane myPane = new JEditorPane() {
    protected InputStream getStream(URL url) throws IOException {

        HttpGet httpget = new HttpGet(url.toExternalForm());

        HttpResponse response = httpClient.execute(httpget);
        HttpEntity entity = response.getEntity();

        // important!  by overriding getStream you're responsible for setting content type!
        setContentType(entity.getContentType().getValue());

        // another thing that you're now responsible for...  this will be used to resolve
        // the images and other relative references.  also beware whether it needs to be a url or string
        getDocument().putProperty(Document.StreamDescriptionProperty, url);

        // using commons-io here to take care of some of the more annoying aspects of InputStream
        InputStream content = entity.getContent();
        try {
            return new ByteArrayInputStream(IOUtils.toByteArray(content));
        }
        catch(RuntimeException e) {
            httpget.abort();  // per example in HttpClient, abort needs to be called on unexpected exceptions
            throw e;
        }
        finally {
            IOUtils.closeQuietly(content);
        }
    }
};

// now you can do this!
myPane.setPage(new URL("http://www.google.com/"));

通过进行此更改,您将使用HttpClient来获取JEditorPane的URL内容。请确保在此处http://download.oracle.com/javase/1.4.2/docs/api/javax/swing/JEditorPane.html#getStream(java.net.URL)阅读JavaDoc
,以确保您捕获了所有JavaDoc 角落里的情况。我想我已经对它们中的大多数进行了排序,但是我不是专家。

当然,您可以在代码的HttpClient部分周围进行更改,以避免首先将响应加载到内存中,但这是最简洁的方法。而且由于您要将其加载到编辑器中,因此某个时刻它们都将保存在内存中。;)



 类似资料:
  • 问题内容: 我在Android中的HttpClient遇到问题:通过使用以下代码,我想使用通过Web视图登录之前已设置的cookie。因此,登录数据应该存在并且确实存在,我对此进行了测试。但是,当我在httppost或httpget中使用cookie时,它不使用登录数据。但是这些cookie实际上应该足以接收需要登录的页面,不是吗?我不确定我是否需要以特殊方式将cookie发送到服务器,或者是否足

  • Sessions 和 cookies 允许数据在多次请求中保持, 在纯 PHP 中,可以分别使用全局变量 $_SESSION 和 $_COOKIE 来访问,Yii 将 session 和 cookie 封装成对象并增加一些功能, 可通过面向对象方式访问它们。 Sessions 和 请求 和 响应类似, 默认可通过为 yii\web\Session 实例的 session 应用组件 来访问 sess

  • Cookie是简单的小文件/数据,通过服务器请求发送到客户端并存储在客户端。 每次用户加载网站时,都会随请求一起发送此cookie。 这有助于我们跟踪用户的操作。 以下是HTTP Cookie的众多用途 - 会话管理 个性化(推荐系统) User tracking 要在Express中使用cookie,我们需要cookie-parser中间件。 要安装它,请使用以下代码 - npm install

  • 有时,您可能希望根据Web应用程序的要求在每个站点访问者的基础上存储一些数据。 请记住,cookie是保存在客户端的,并且根据您的客户端浏览器安全级别,设置cookie有时可能会工作,有时可能不会。 为了说明Django中的cookie处理,让我们使用之前创建的登录系统创建一个系统。 系统将让您保持登录X分钟的时间,超过该时间,您将退出应用程序。 为此,您需要设置两个cookie,last_con

  • 什么是饼干? Web浏览器和服务器使用HTTP协议进行通信,HTTP是无状态协议。 但对于商业网站,需要在不同页面之间维护会话信息。 例如,一个用户注册在完成许多页面后结束。 但是如何在所有网页上维护用户的会话信息。 在许多情况下,使用Cookie是记住和跟踪偏好,购买,佣金以及更好的访问者体验或网站统计所需的其他信息的最有效方法。 这个怎么运作 ? 您的服务器以cookie的形式向访问者的浏览器

  • Web浏览器和服务器使用HTTP协议进行通信。 HTTP是无状态协议,即它不会在客户端发出的多个请求中维护客户端的数据。 客户端和服务器之间的完整请求 - 响应周期被定义为session 。 Cookie是浏览器用于存储与用户会话相关的数据的默认机制。 它是如何工作的 (How It Works?) 您的服务器以cookie的形式向访问者的浏览器发送一些数据。 浏览器可以接受cookie。 如果是