Http学习之使用HttpURLConnection发送post和get请求(3)
2023-09-11 14:13:56 时间
使用HttpURLConnection发送post和get请求
但我们常常会碰到这样一种情况:
通过HttpURLConnection来模拟模拟用户登录Web服务器,服务器使用cookie进行用户认证。在模拟登录时,Post表单数据后可以正确登录(登陆成功时会response一个cookie,然后redirect到main page,不成功则redirect到login page),但是在使用HttpURLConnection再次连接服务器其他页面(或者即使是当前的response里是redirect的page)时,服务器都会认为是全新的一个Session。
解决方法有2步:
1. 调用HttpURLConnection (send post request to login page)的setInstanceFollowRedirects()方法,参数为false (这样不会去获取redirect page)
2. 获取HttpURLConnection send post request to login page的session id,然后在之后每一次的connection里都加上该session id
public static String sessionId = ""; public static void sendLoginRequest() throws IOException { URL loginUrl = new URL("http://xxx"); HttpURLConnection connection = (HttpURLConnection) loginUrl.openConnection(); // Output to the connection. Default is // false, set to true because post // method must write something to the // connection // 设置是否向connection输出,因为这个是post请求,参数要放在 // http正文内,因此需要设为true connection.setDoOutput(true); // Read from the connection. Default is true. connection.setDoInput(true); // Set the post method. Default is GET connection.setRequestMethod("POST"); // Post cannot use caches // Post 请求不能使用缓存 connection.setUseCaches(false); // This method takes effects to // every instances of this class. // URLConnection.setFollowRedirects是static函数,作用于所有的URLConnection对象。 // connection.setFollowRedirects(true); // This methods only // takes effacts to this // instance. // URLConnection.setInstanceFollowRedirects是成员函数,仅作用于当前函数 connection.setInstanceFollowRedirects(false); // Set the content type to urlencoded, // because we will write // some URL-encoded content to the // connection. Settings above must be set before connect! // 配置本次连接的Content-type,配置为application/x-www-form-urlencoded的 // 意思是正文是urlencoded编码过的form参数,下面我们可以看到我们对正文内容使用URLEncoder.encode // 进行编码 connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); // 连接,从postUrl.openConnection()至此的配置必须要在connect之前完成, // 要注意的是connection.getOutputStream会隐含的进行connect。 connection.connect(); DataOutputStream out = new DataOutputStream(connection .getOutputStream()); // 要传的参数 String content = URLEncoder.encode("username", "UTF-8") + "=" + URLEncoder.encode("XXX", "UTF-8"); content += "&" + URLEncoder.encode("password", "UTF-8") + "=" + URLEncoder.encode("XXXX", "UTF-8"); // DataOutputStream.writeBytes将字符串中的16位的unicode字符以8位的字符形式写道流里面 out.writeBytes(content); out.flush(); out.close(); // flush and close //Get Session ID String key = ""; if (connection != null) { for (int i = 1; (key = connection.getHeaderFieldKey(i)) != null; i++) { if (key.equalsIgnoreCase("set-cookie")) { sessionId = connection.getHeaderField(key); sessionId = sessionId.substring(0, sessionId.indexOf(";")); } } } connection.disconnect(); }
然后之后每一次connection都要加上这个session id:
URL url = new URL("http:......");
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setRequestProperty("Cookie",this.sessionId);
connection.connect();
相关文章
- 【Http协议】深入理解HTTP协议
- HTTP Status 500 - The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar files deployed with this application
- 设计模式(七)学习----命令模式
- angularjs中$http、$location、$watch及双向数据绑定学习实现简单登陆验证
- 【LINUX学习】磁盘分割之建立primary和logical 分区
- JavaWeb 后端 <一> 之 Tomcat服务器 - Http协议 学习笔记
- hosts学习整理
- 前端学习 -- Css -- 内联元素的盒模型
- http性能测试工具wrk源码学习之开篇
- [Http] Understand what an HTTP Request is
- http性能测试工具wrk源码学习之开篇
- [Http] Understand what an HTTP Request is
- Maven 3.8.1新特性:默认屏蔽外部 HTTP 资源库(会导致repo或mirror地址为http时报错)
- [ML] 机器学习简介
- 学习如何管理-录视频
- 机器学习(三十四):可视化决策树的四个方法
- 【ML】现实生活中的十大机器学习示例(让世界变得更美好)
- 2.2机器学习三要素模型,学习准则,优化算法
- Cocos2d-X学习——Android移植,使用第三方库.so被删掉问题
- Android之Http沟通——4.Android HTTP索取信息:HttpClient
- Java线程学习笔记(两) 线程异常处理
- SecureCRT学习之道:SecureCRT经常使用快捷键设置与字体设置方法
- Nginx学习——http配置项解析编程
- (十)unity4.6学习Ugui中文文档-------參考-UGUI Canvas Components
- HTTP隧道ABPTTS——加密型的http隧道,todo自己搭建一个玩玩
- 思科恶意加密TLS流检测论文记录——由于样本不均衡,其实做得并不好,神马99.9的准确率都是浮云啊,之所以思科使用DNS和http一个重要假设是DGA和HTTP C&C(正常http会有图片等)。一开始思科使用的逻辑回归,后面17年文章是随机森林。
- 学习 C++,关键是要理解概念,而不应过于深究语言的技术细节
- 【ML】第 1 章 :分布式机器学习:术语和概念
- 【Pytorch】第 1 章 :强化学习和 PyTorch 入门