热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

httpclient4.5获取和设置cookie

HttpClient模拟登陆HTTP协议本来是无状态的,但为了保持会话的状态,使用Cookie保存Session信息,当向服务器发送请求时会附加一些会话信息,从而能区分不同会话

HttpClient模拟登陆

     HTTP协议本来是无状态的,但为了保持会话的状态,使用COOKIE保存Session信息,当向服务器发送请求时会附加一些会话信息,从而能区分不同会话的状态。用户登陆过程,其实简单而言,就是首先验证用户名与密码,然后服务器生成会话信息保存到本地,最后用户凭借会话信息能够访问类似用户信息等需登陆的网页。

    HttpClient4.5通过COOKIEStore保存用户的会话信息,还提供HttpClientContext保存用户连接的信息。下面是一个使用HttpClient模拟知乎登陆的简单案例。


import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
 
import org.apache.http.Consts;
import org.apache.http.NameValuePair;
import org.apache.http.client.COOKIEStore;
import org.apache.http.client.config.COOKIESpecs;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.COOKIE.COOKIE;
import org.apache.http.impl.client.BasicCOOKIEStore;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
 
/**
 * 模拟登陆知乎
 */
public class ZhiHuTest {
 
  public static void main(String[] args) throws java.text.ParseException {
    String name = "username";
    String password = "password"
     
    // 全局请求设置
    RequestConfig globalCOnfig= RequestConfig.custom().setCOOKIESpec(COOKIESpecs.STANDARD).build();
    // 创建COOKIE store的本地实例
    COOKIEStore COOKIEStore = new BasicCOOKIEStore();
    // 创建HttpClient上下文
    HttpClientContext cOntext= HttpClientContext.create();
    context.setCOOKIEStore(COOKIEStore);
 
    // 创建一个HttpClient
    CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(globalConfig)
        .setDefaultCOOKIEStore(COOKIEStore).build();
 
    CloseableHttpResponse res = null;
 
    // 创建本地的HTTP内容
    try {
      try {
        // 创建一个get请求用来获取必要的COOKIE,如_xsrf信息
        HttpGet get = new HttpGet("http://www.zhihu.com/");
 
        res = httpClient.execute(get);
        // 获取常用COOKIE,包括_xsrf信息,放在发送请求之后
        System.out.println("访问知乎首页后的获取的常规COOKIE:===============");
        for (COOKIE c : COOKIEStore.getCOOKIEs()) {
          System.out.println(c.getName() + ": " + c.getValue());
        }
        res.close();
 
        // 构造post数据
        List valuePairs = new LinkedList();
        valuePairs.add(new BasicNameValuePair("email", name));
        valuePairs.add(new BasicNameValuePair("password", password));
        valuePairs.add(new BasicNameValuePair("remember_me", "true"));
        UrlEncodedFormEntity entity = new UrlEncodedFormEntity(valuePairs, Consts.UTF_8);
        entity.setContentType("application/x-www-form-urlencoded");
 
        // 创建一个post请求
        HttpPost post = new HttpPost("https://www.zhihu.com/login/email");
        // 注入post数据
        post.setEntity(entity);
        res = httpClient.execute(post);
 
        // 打印响应信息,查看是否登陆是否成功
        System.out.println("打印响应信息===========");
        HttpClientUtils.printResponse(res);
        res.close();
         
        //放在post请求之后,获取的是响应头的Set-COOKIE 
        System.out.println("登陆成功后,新的COOKIE:===============");
        for (COOKIE c : context.getCOOKIEStore().getCOOKIEs()) {
          System.out.println(c.getName() + ": " + c.getValue());
        }
 
        // 构造一个新的get请求,用来测试登录是否成功
        HttpGet newGet = new HttpGet("http://www.zhihu.com/question/following");
        res = httpClient.execute(newGet, context);
        String cOntent= EntityUtils.toString(res.getEntity());
        System.out.println("登陆成功后访问的页面===============");
        System.out.println(content);
        res.close();
 
      } finally {
        httpClient.close();
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}


推荐阅读
  • 本文探讨了在使用Apache HttpClient 4.x(作为commons-httpclient 3.x的后续版本)时,如何配置默认的HttpContext,以确保每次执行请求时无需显式传递上下文。 ... [详细]
  • C#爬虫Fiddler插件开发自动生成代码
    哈喽^_^一般我们在编写网页爬虫的时候经常会使用到Fiddler这个工具来分析http包,而且通常并不是分析一个包就够了的,所以为了把更多的时间放在分析http包上,自动化生成 ... [详细]
  • Cookie学习小结
    Cookie学习小结 ... [详细]
  • 本文将指导你通过 Gulp 和 Webpack 构建一个简单的用户登录界面,包括目录结构设置和关键文件的配置。 ... [详细]
  • 正在学习操作系统开发,遇到一个内核在GRUB Legacy(0.97)中无法成功引导的问题。具体表现为输入内核命令后显示错误信息,尝试引导时GRUB挂起。 ... [详细]
  • 本文总结了几个常用的Android开发技巧,包括检测设备上是否安装特定应用、获取应用的版本名称、设置状态栏透明以及如何从一个应用跳转至另一个应用的方法。 ... [详细]
  • 本文介绍如何使用Java实现AC自动机(Aho-Corasick算法),以实现高效的多模式字符串匹配。文章涵盖了Trie树和KMP算法的基础知识,并提供了一个详细的代码示例,包括构建Trie树、设置失败指针以及执行搜索的过程。 ... [详细]
  • 近期在研究Java IO流技术时,遇到了一个关于如何正确读取Doc文档而不出现乱码的问题。本文将详细介绍使用Apache POI库处理Doc和Docx文件的具体方法,包括必要的库引入和示例代码。 ... [详细]
  • 本文详细介绍了跨站脚本攻击(XSS)的基本概念、工作原理,并通过实际案例演示如何构建XSS漏洞的测试环境,以及探讨了XSS攻击的不同形式和防御策略。 ... [详细]
  • 如何使用Maven将依赖插件一并打包进JAR文件
    本文详细介绍了在使用Maven构建项目时,如何将所需的依赖插件一同打包进最终的JAR文件中,以避免手动部署依赖库的麻烦。 ... [详细]
  • 本文详细探讨了在Web开发中常见的UTF-8编码问题及其解决方案,包括HTML页面、PHP脚本、MySQL数据库以及JavaScript和Flash应用中的乱码问题。 ... [详细]
  • 本文通过一个具体的案例,展示了如何使用 Python 爬虫技术从京东网站爬取手机的价格和参数。最近发布的 iPhone X 虽然价格昂贵,但不妨碍我们探索其他高性价比的国产手机。 ... [详细]
  • HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送www方式的数据。HTTP协议采用了请求响应模型。客服端向服务器发送一 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 使用 ModelAttribute 实现页面数据自动填充
    本文介绍了如何利用 Spring MVC 中的 ModelAttribute 注解,在页面跳转后自动填充表单数据。主要探讨了两种实现方法及其背后的原理。 ... [详细]
author-avatar
粉爱_粉爱陈小翔
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有