关于Http请求Cookie问题
在Http请求中,很多时候我们要设置Cookie和获取返回的Cookie,在这个问题上踩了一个很大的坑,主要是两个问题:
1.不能获取到重定向返回的Cookie;
2.两次请求返回的Cookie是相同的;
(接口是苏宁登录的接口,是用ids_r_me兑换authId的,这是单点登录常见的方式)后来我花了一点时间把几种不同的包中的坑总结一下:
第一个:apache下在httpclient
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.6</version>
</dependency>
这个包在获取重定向Cookie时,会存在丢失Cookie的情况,这个包没有提供获取Cookie的借口方法,只能是通过Header获取Cookie和Set-Cookie获取返回的Cookie,用这个包发送Http请求好像没有存储重定向的Cookie,过程中肯定是有用到的,但是没有对外提供获取Cookie的接口,代码如下:
/**
* apache httpclient 4.5.6 test redirect Cookie
*/
@Test
public void Test_2() throws IOException {
List<String> list = new ArrayList();
list.add("NjIyMDY5MDk1M19CUk9XU0VSXz**********************************18wXzQ2OWM1ZjI3 NDdjN2RmYzRiZWI3Njg3MDllNzI3MmFj");
list.add("NzEwNDIyNjQwN19CUk9XU0VSXz**********************************M18wX2JiZWQ5YmVkMjJiOTAyZDNjYmNkZTk4NGM0NmFiYmMz");
String url = "https://passport.suning.com/ids/login?service=https%3A%2F%2Fmy.suning.com%2Fmsi-web%2Fauth%3FtargetUrl%3Dhttps%253A%252F%252Floginst.suning.com%252FauthStatus%253F_%253D1540179466121%2526callback%253DZepto1540179465802"; for (String token : list) {
HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
CloseableHttpClient httpClient = httpClientBuilder.build();
HttpGet httpGet = new HttpGet(url);
httpGet.setHeader("Cookie", "ids_r_me=" + token);
CloseableHttpResponse response = httpClient.execute(httpGet);
org.apache.http.Header[] headers = response.getAllHeaders();
for (org.apache.http.Header header : headers) {
System.out.println(header.getName() + "=" + header.getValue());
}
System.out.println(EntityUtils.toString(response.getEntity()) );
}
}
因为没有找到获取Cookie的接口,所以打印了所有的header。
第二个:hutool
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.2.1</version>
</dependency>
这个包默认是可以获取Cookie的,但是开始遇到的问题是,第二次请求时获取的Cookie和第一次一样,因为这个包中的cookieManager是一个静态变量,但是第二次请求应该会覆盖掉才对,具体为什么不回覆盖没有再深追,后来找到了它提供的一个清空cookieManager中cookieStore的方法,问题就解决了。两次请求获取的是正常的Cookie。代码如下:
/**
* Hutool 4.2.1 test redirect Cookie
*/
@Test
public void Test_1() {
List<String> list = new ArrayList();
list.add("NjIyMDY5MDk1M19CUk9XU0VSXz**********************************18wXzQ2OWM1ZjI3 NDdjN2RmYzRiZWI3Njg3MDllNzI3MmFj");
list.add("NzEwNDIyNjQwN19CUk9XU0VSXz**********************************M18wX2JiZWQ5YmVkMjJiOTAyZDNjYmNkZTk4NGM0NmFiYmMz");
String url = "https://passport.suning.com/ids/login?service=https%3A%2F%2Fmy.suning.com%2Fmsi-web%2Fauth%3FtargetUrl%3Dhttps%253A%252F%252Floginst.suning.com%252FauthStatus%253F_%253D1540179466121%2526callback%253DZepto1540179465802";
for (String token : list) { HttpRequest request = HttpUtil.createGet(url);
Map header = new HashMap();
header.put("Cookie", "ids_r_me=" + token);
request = request.addHeaders(header); HttpResponse response = request.execute(); List<HttpCookie> cookieList = response.getCookies();
System.out.println("Cookie:");
for (HttpCookie cookie : cookieList) {
System.out.println(cookie.getName() + "=" + cookie.getValue());
}
HttpRequest.getCookieManager().getCookieStore().removeAll();
}
}
其中第24行是清除本次请求中的Cookie,如果放在response.getCookies()之前,就不能获取到Cookie了,所以应该是获取到Cookie后,清除本次请求的Cookie。
第三个:commons-httpclient
<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
<version>3.1</version>
</dependency>
这个包发送请求返回的有点奇怪,但是习惯了感觉好像也挺合理,代码如下:
/**
* commons-httpclient 3.1 test redirect Cookie
*
* @throws IOException
*/
@Test
public void Test_3() throws IOException {
List<String> list = new ArrayList();
list.add("NjIyMDY5MDk1M19CUk9XU0VSXz**********************************18wXzQ2OWM1ZjI3 NDdjN2RmYzRiZWI3Njg3MDllNzI3MmFj");
list.add("NzEwNDIyNjQwN19CUk9XU0VSXz**********************************M18wX2JiZWQ5YmVkMjJiOTAyZDNjYmNkZTk4NGM0NmFiYmMz");
String url = "https://passport.suning.com/ids/login?service=https%3A%2F%2Fmy.suning.com%2Fmsi-web%2Fauth%3FtargetUrl%3Dhttps%253A%252F%252Floginst.suning.com%252FauthStatus%253F_%253D1540179466121%2526callback%253DZepto1540179465802";
for (String token : list) {
HttpClient httpClient = new HttpClient();
GetMethod getMethod = new GetMethod(url); getMethod.setRequestHeader(new Header("Cookie", "ids_r_me=" + token));
Integer state = httpClient.executeMethod(getMethod);
Cookie[] cookieArray = httpClient.getState().getCookies();
for (Cookie cookie : cookieArray) {
System.out.println(cookie.getName() + "=" + cookie.getValue());
}
System.out.println("responseBody:"+getMethod.getResponseBodyAsString());
}
}
其中第17行返回的是本次请求的状态码,第22行是获取本次请求返回内容。
关于Http请求Cookie问题的更多相关文章
- ios htttp网络请求cookie的读取与写入(NSHTTPCookieStorage)
当你访问一个网站时,NSURLRequest都会帮你主动记录下来你访问的站点设置的Cookie,如果 Cookie 存在的话,会把这些信息放在 NSHTTPCookieStorage 容器中共享,当你 ...
- 【SpringMVC】SpringMVC系列6之@CookieValue 映射请求Cookie 值
6.@CookieValue 映射请求Cookie 值 6.1.示例 @CookieValue 可让处理方法入参绑定某个 Cookie 值,示例如下:
- 关于模拟http请求 cookie的赋值
最近的工作一直是关于模拟http请求方面的知识的. 原本以为很简单,就是简单模拟一下http请求.先用fiddler模拟一下请求,验证接口可用,就直接上代码. 但是在模拟一个联通http的请求时候,我 ...
- ajax请求cookie有效性问题验证
与人讨论时遇到一个问题,就是: 浏览器中后台发起的一个异步ajax请求,服务器做响应时,附带了cookie信息,那么后续对同域名下其他页面请求时,该cookie是否有效,会一并随请求提交到web服务器 ...
- 跨域请求cookie获取与设置问题
描述:最近做项目遇到了cookie的问题,项目为前后端分离项目,前台有分外网IP(A外)和内网IP(A内),后台服务只有一个内网IP(B内). 现象:当我前台异步请求发送给后台的时候,后台并不能获取到 ...
- 使用httpClient获取请求cookie
package mytest; import java.util.ArrayList; import java.util.List; import org.apache.http.NameValueP ...
- java Ajax跨域请求COOKIE无法带上的解决办法
1.web.xml加入以下节点,,一定放在第一个filter <!--目录下所有文件可以跨域Begin--> <filter> <filter-name>CorsF ...
- Ajax跨域请求COOKIE无法带上的解决办法
原生ajax请求方式: var xhr = new XMLHttpRequest(); xhr.open("POST", "http://xxxx.com/demo/b/ ...
- (http请求+cookie)的交互流程
如果步骤5携带的是过期的cookie或者是错误的cookie,那么将认证失败,返回至要求身份认证页面. 当前 Cookie 有两个版本:Version 0 和 Version 1.通过它们有两种设置响 ...
随机推荐
- vue 使用 computed 结合 filter 实现数据的的过滤和排序
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 禁止html复制文本
<body class="content" oncontextmenu="return false" onselectstart="return ...
- UVAlive 6763 Modified LCS
LCS stands for longest common subsequence, and it is a well known problem. A sequence in thisproblem ...
- project euler-34
145是个奇怪的数字.由于1!+ 4! + 5! = 1 + 24 + 120 = 145. 请求出能表示成其每位数的阶乘的和的全部数的和. 请注意:由于1! = 1和2! = 2不是和,故它们并不包 ...
- 关于JSON.stringify()与JSON.parse()
一.JSON.stringify()与JSON.parse()的区别 JSON.stringify()的作用是将js值转换成JSON字符串,而JSON.parse()是将JSON字符串转换成一个对象. ...
- Python中集合类型的使用
集合类型 多个不重复元素的无序组合 集合类型的表示 建立非空集合的方式可以用{}来表示 采用set()来表示 集合类型的操作符 S|T 返回一个新集合,这个集合包含S与T中的所有元素. S-T 返回一 ...
- 阿里云LNMP环境安装
文档里有一键部署LNMP环境和手动搭建LNMP环境您看下 镜像部署 LNMP 环境:https://help.aliyun.com/document_detail/25427.html?spm=517 ...
- centos GIT安装
[注](yum 源仓库里的 Git 版本更新不及时,最新版本的 Git 是 1.8.3.1,但是官方最新版本已经到了 2.9.2.想要安装最新版本的的 Git,只能下载源码进行安装.) 安装git服务 ...
- html5 jquery音乐播放器,play()和pause()不起作用
今天在自己写的页面上加上背景音乐,当我点击图片时可以切换 播放/暂停 用jquery写的,方法总是提示没有pause这个方法! 检查了半天最后发现 你使用的是jquery选择器所以返回的是jquery ...
- Mac brew 安装Postgres 开机自启动
以下所有命令在mac 终端执行 1.安装postgres brew install postgres 2.brew 安装的程序都可以在/usr/local/Cellar/下找到,去/usr/local ...