1、在py中requests.post()和get()函数都是在那个函数内部里面自动生成了一个Session类的实例,所以requests,post和get函数要想干登陆后才能干的事情,需要添加cookie或者把cookie写在headers里面,要想自动管理cookie,就不能每次请求都实例化一个新的Session类的对象了,需要直接实例化Session类,然后使用该实例,而不是使用那两个函数。

py的Session类的使用方法是:

ss = requests.Session()

ss.post(login_url,data = {"username":"xiaomin", "password":"123456"})

ss.get(some_url)

2、java的OkHttp3默认是不自动管理cookie。

默认是使用NIO_COOKIES

3、实现cookie自动管理,需要在OkhttpClient类的Builder类中的cookieJar方法传入CookieJar实例。

实现CookieJar接口中的saveFromResponse 和loadForRequest方法,把cookie保存到haspmap中,读取也是从hashmap中,这样就实现自动管理cookie。如果要保持代码重启还能持久化cookie管理可以使用redis  sqllite 或者实现Serializable,序列化cookie到文件。

okhttp3.internal.http.BridgeInterceptor;okhttp3.internal.http.HttpHeaders;为什么实现了CookieJar这两个文件中会调用传进去的实例的这两个方法,根据了请求的url的域名,把cookie添加到request的header了,返回时候从header里面保存cookie,如果传的实例如果没有这两个方法那会运行出错。

packagecom.touna.httprequest;importjava.text.MessageFormat;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Set;import java.util.regex.*;importokhttp3.Cookie;importokhttp3.CookieJar;importokhttp3.FormBody;importokhttp3.HttpUrl;importokhttp3.OkHttpClient;importokhttp3.Request;importokhttp3.Response;importcom.touna.view.LogUtil;public classSession {private final OkHttpClient mOkHttpClient = new OkHttpClient.Builder().cookieJar(newCookieJarManager()).build();     //如果直接写个类,里面写saveFromResponse和loadForRequest,而不实现CookieJar接口,运行可以正常通过,但ide会显红,因为Bulider类的cookieJsr方法需要接受CookieJar类型的实例。鸭子类除了能节约代码行数,在可理解性 可读性 多人合作性上面都不如接口规范,谁知道鸭子类里面要写什么方法,除了写代码得人自己。private class CookieJarManager implementsCookieJar{private final HashMap<String, List<Cookie>> cookieStore = new HashMap<>();@Overridepublic void saveFromResponse(HttpUrl url, List<Cookie>cookies) {cookieStore.put(url.host(), cookies);}@Overridepublic List<Cookie>loadForRequest(HttpUrl url) {List<Cookie> cookies =cookieStore.get(url.host());return cookies != null ? cookies : new ArrayList<Cookie>(){};}}/***@paramurl  要请求的url*@paramparamsMap post的请求参数*@returnpost的返回结果*/public String post(String url, HashMap<String, String >paramsMap){LogUtil.printLog("请求的url是:" +url);FormBody.Builder formBodyBuilder= newFormBody.Builder();Set<String> keySet =paramsMap.keySet();for(String key:keySet) {String value=paramsMap.get(key);formBodyBuilder.add(key,value);}FormBody formBody=formBodyBuilder.build();Request request= newRequest.Builder().post(formBody).url(url).build();try (Response response =mOkHttpClient.newCall(request).execute()) {String  respStr=response.body().string();LogUtil.printLog("返回是: "   +respStr);returnrespStr;}catch(Exception e){LogUtil.printLog("post失败");e.printStackTrace();return "";}}publicString get(String url)  {final Request.Builder builder = newRequest.Builder();builder.url(url);final Request request =builder.build();try (Response response =mOkHttpClient.newCall(request).execute()) {returnresponse.body().string();}catch(Exception e){e.printStackTrace();return "";}}/***@parammail163Account 163邮箱账号;*@parampasswd 邮箱密码**/private static voidtest163(String mail163Account, String passwd){String loginUrl= MessageFormat.format("https://mail.163.com/entry/cgi/ntesdoor?funcid=loginone&language=-1&passtype=1" +"&iframe=1&product=mail163&from=web&df=email163&race=-2_262_-2_hz&module=&uid={0}&style=-1&net=t&skinid=null",mail163Account);Session ss= newSession();HashMap<String,String> paramsMap = new HashMap<>() ;paramsMap.put("username",mail163Account);paramsMap.put("url2","http://email.163.com/errorpage/error163.htm");paramsMap.put("savalogin","0");paramsMap.put("password",passwd);String respStr= ss.post(loginUrl,paramsMap);  //登录
Pattern sidPattern= Pattern.compile("sid=(.*)&");Matcher m=sidPattern.matcher(respStr);if (!m.find()){LogUtil.printLog("登录失败");}else{String sid= m.group(1);LogUtil.printLog(sid);String mailListUrl= MessageFormat.format("https://mail.163.com/js6/s?sid={0}&func=mbox:listMessages",sid);HashMap<String,String> dataMap = new HashMap<>() ;dataMap.put("var","<?xml version=\"1.0\"?><object><int name=\"fid\">1</int><string name=\"order\">date</string><boolean name=\"desc\">true" +"</boolean><int name=\"limit\">20</int><int name=\"start\">0</int><boolean name=\"skipLockedFolders\">false</boolean><string name" +"=\"topFlag\">top</string><boolean name=\"returnTag\">true</boolean><boolean name=\"returnTotal\">true</boolean></object>");LogUtil.printLog("读取邮件列表:");ss.post(mailListUrl,dataMap);}}public static voidmain(String[] args) {test163("13148804506@163.com", "123456");}}

4、使用163邮箱登录,然后测试下获取邮件列表能否获取到。

测试结果,这样只要Session类的实例请求了登录接口后,就能干其他的事情了。

java 实现类似于python requests包的Session类,自动管理cookie。相关推荐

  1. java swing还有人用吗_Java不是自动管理内存吗,怎么还有内存泄漏?

    最近最我的机顶盒里有个Android应用老提示应用已停止运行,我查看Log后发现是Java堆内存溢出然后挂掉了.Java不是自动管理内存吗,怎么还会有内存泄漏,是Java虚拟机的垃圾回收机制有问题吗? ...

  2. JAVA中J.U.C 包下并发类的应用

    文章目录 JUC包中的锁应用 Lock接口及ReentrantLock对象分析及应用? Condition接口对象分析与应用? ReadWriteLock接口及实现类分析与应用? StampedLoc ...

  3. java去哪导包_在Java语言中,哪一个包中的类是自动导入的?( )java.applet

    包括,语言中标的详细评审核心是评,标书性审进行查是对实质. 对一的某栋厂行评企业估房进,包中在资估中产评,属于. 完成修正总概算,类动导现工目的会发和数化可能建设.类动导结规模构.程项类型量有设备所变 ...

  4. java/php/net/python中医体质的社区居民健康管理设计

    本系统带文档lw万字以上+答辩PPT+查重 如果这个题目不合适,可以去我上传的资源里面找题目,找不到的话,评论留下题目,或者站内私信我, 有时间看到机会给您发 系统体系结构 中医体质的社区居民健康管理 ...

  5. Python使用property函数为类创建管理方法属性

    1.如何创建可管理的对象属性? 实际案例: 在面向对象编程中,我们把方法(函数)看作对象的接口,直接访问对象的属性可能是不安全的,或设计上不够灵活.但是使用调用方法在形式上不如访问属性简洁. # 创建 ...

  6. Python requests模块session day6

    一.get请求 格式: import requestsreq = requests.get('http://www.nnzhp.cn',data={'username':'xxx'},cookies= ...

  7. Python requests ip代理爬虫报错 HTTPSConnectionPool(host=‘xxxxx‘, port=443) Max retries exceed

    本人系统:macOS10.15.6 Catalina 场景:使用Python requests 包+ip代理池爬取网站数据 出现报错:HTTPSConnectionPool(host='xxxxx', ...

  8. Python requests ip代理爬虫报错 HTTPSConnectionPool(host=‘xxxxx‘, port=443): Max retries exceed...

    本人系统:macOS10.15.6 Catalina 场景:使用Python requests 包+ip代理池爬取网站数据 出现报错:HTTPSConnectionPool(host='xxxxx', ...

  9. Python + Requests 模拟登陆(含验证码)

    其实模拟登陆非常简单,只要在打开网站的同时提交数据就可以了. 下面通过登陆超星网来举例说明如何一步步实现模拟登陆. 1.获取需要提交的数据 使用chrome的Network或者fiddler可以很轻易 ...

最新文章

  1. centos 6.8 编译安装git 2.11.0
  2. 思考灰鸽子之后,新***的运营模式
  3. python 字典查询比列表快_Python字典vs列表,哪个更快?
  4. linux mysql 主从数据库_linux mysql数据库的主从配置
  5. 使用工厂方法模式设计最佳实践
  6. 003很好的网络博客(TCP/IP)-很全
  7. golang服务开发平滑升级之优雅重启
  8. 黄聪:Loopup集合类笔记
  9. 【转】数据库范式(1NF 2NF 3NF BCNF)详解二
  10. java IO 超详细讲解
  11. 史上最全的OpenCV入门教程
  12. 关于极限编程简单介绍
  13. 结合百度地图城市编码的数据表
  14. 请定义一个方法用于判断一个字符串是否是对称的字符串,并在主方法中测试方法。例如:“abcba“、“上海自来水来自海上“均为对称字符串。
  15. ios持续化集成-fastlane+jenkins+蒲公英+alfred+Webhook通知企业微信
  16. 什么是亲和力?如何提高亲和力?HR人才测评
  17. CentOS7和CentOS8 FreeSWITCH 1.10.7 简单图形化界面5--阿里云服务器设置
  18. 计算机用户接入广域网的技术,第五章广域网接入技术全解.ppt
  19. 梦在远方,而你在心上
  20. Oracle参数为英文或数字,ORACLE中将数字转换为英文

热门文章

  1. RabbitMQ核心概念和AMQP协议(二)
  2. Codeforces Round #480 (Div. 2) B. Marlin
  3. click()和onclick()的区别
  4. 从资源管理器中,获取被选择的文件的路径(及文件夹)的API
  5. dos命令安装windows服务
  6. 如何选择高速存储、查询数据库
  7. JavaScript执行bat文件清理浏览器缓存
  8. Android学习笔记(八)
  9. 一些实用的JS代码。
  10. 诗与远方:无题(八十五)- 无字天书