在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问题的更多相关文章

  1. ios htttp网络请求cookie的读取与写入(NSHTTPCookieStorage)

    当你访问一个网站时,NSURLRequest都会帮你主动记录下来你访问的站点设置的Cookie,如果 Cookie 存在的话,会把这些信息放在 NSHTTPCookieStorage 容器中共享,当你 ...

  2. 【SpringMVC】SpringMVC系列6之@CookieValue 映射请求Cookie 值

      6.@CookieValue 映射请求Cookie 值 6.1.示例 @CookieValue 可让处理方法入参绑定某个 Cookie 值,示例如下:     

  3. 关于模拟http请求 cookie的赋值

    最近的工作一直是关于模拟http请求方面的知识的. 原本以为很简单,就是简单模拟一下http请求.先用fiddler模拟一下请求,验证接口可用,就直接上代码. 但是在模拟一个联通http的请求时候,我 ...

  4. ajax请求cookie有效性问题验证

    与人讨论时遇到一个问题,就是: 浏览器中后台发起的一个异步ajax请求,服务器做响应时,附带了cookie信息,那么后续对同域名下其他页面请求时,该cookie是否有效,会一并随请求提交到web服务器 ...

  5. 跨域请求cookie获取与设置问题

    描述:最近做项目遇到了cookie的问题,项目为前后端分离项目,前台有分外网IP(A外)和内网IP(A内),后台服务只有一个内网IP(B内). 现象:当我前台异步请求发送给后台的时候,后台并不能获取到 ...

  6. 使用httpClient获取请求cookie

    package mytest; import java.util.ArrayList; import java.util.List; import org.apache.http.NameValueP ...

  7. java Ajax跨域请求COOKIE无法带上的解决办法

    1.web.xml加入以下节点,,一定放在第一个filter <!--目录下所有文件可以跨域Begin--> <filter> <filter-name>CorsF ...

  8. Ajax跨域请求COOKIE无法带上的解决办法

    原生ajax请求方式: var xhr = new XMLHttpRequest(); xhr.open("POST", "http://xxxx.com/demo/b/ ...

  9. (http请求+cookie)的交互流程

    如果步骤5携带的是过期的cookie或者是错误的cookie,那么将认证失败,返回至要求身份认证页面. 当前 Cookie 有两个版本:Version 0 和 Version 1.通过它们有两种设置响 ...

随机推荐

  1. 利用pwdx查看Linux程序的工作目录

    Linux中的pwdx命令,利用进程号作为参数,可以打印出指定进程号的工作目录,帮助我们区分不同的进程. pwdx <pid> [hnyundev@BJ03000036 ~]$ pwd 3 ...

  2. hdu5857 Median(模拟)

    Median Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Subm ...

  3. hdu4734 F(x)(数位dp)

    题目传送门 F(x) Time Limit: 1000/500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  4. 阿里云ECS服务安装 nginx+php+MariaDB完整版

    安装 Nginx想在 CentOS 系统上安装 Nginx ,你得先去添加一个资源库,像这样: vim /etc/yum.repos.d/nginx.repo使用 vim 命令去打开 /etc/yum ...

  5. 2018-2-13-win10-uwp-分治法

    title author date CreateTime categories win10 uwp 分治法 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 17:2 ...

  6. 134-基于TMS320C6678、FPGA XC5VSX95T的一路Full模式Camera Link图像理平台

    基于TMS320C6678.FPGA XC5VSX95T的一路Full模式Camera Link图像理平台 一.板卡概述 该板卡采用TI公司新一代DSP TMS320C6678,结合FPGA,型号为X ...

  7. This program cannot be run in DOS mode.

    问题:通过ftp上传的exe执行时提示“This program cannot be run in DOS mode.” 解决方法:检查ftp传输模式,设置成binary模式上传即可 参考:https ...

  8. 一、免费API调用

    一.免费API调用: 免费天气api接口 JS调用示例 <!DOCTYPE html> <html lang="zh-CN"> <head> & ...

  9. git兼容svn与hg功能

    本地.git库 远程:push  提交以后push才可以到远程库

  10. java this的应用

    package java04; /* * 当方法的局部变量和类的成员变量重名时,会根据“就近原则”,优先使用局部变量. * 如果需要访问奔雷中的成员变量,需要使用格式: this.成员变量名 * * ...