Http自动跳转Https的接口测试实践

摘要:
日前,需要做一个接口测试,对象是一个web系统,登录的时候需要用SSL连接,登录进入系统后自动转成普通的Http连接。初步尝试一般一个http接口拿来,基本上直接用Httpclient模拟Http请求,通过get或post发送请求,进行接口测试。需要先跳转到Https进行登录操作才行。遇到问题,想解决方法先去了解了下跳转机制,从Http˃Https˃Http的过程中,session是不会丢失的。
日前,需要做一个接口测试,对象是一个web系统,登录的时候需要用SSL连接,登录进入系统后自动转成普通的Http连接。
这种类型的web网站很常见,既保证了登录时的安全,也避免了整个系统使用SSL带来的系统性能下降的问题。
首先,我们把整个访问过程分解成3个过程:
  1. 访问http接口:http://***.com/?;
  2. 跳转到Https,登录用ssl连接:https://login.***.com;
  3. 再返回到http:http://***.com/common/getInfo.do?***;
那进行接口测试应该怎么做呢?
  • 初步尝试
一般一个http接口拿来,基本上直接用Httpclient模拟Http请求,通过get或post发送请求,进行接口测试。
inputurl="http://***.com/common/getEmployeeByDept.do?dept1=D032&dept2=D032002&dept3=D032010"
//创建HttpClientBuilder  
HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();  
//HttpClient  
CloseableHttpClient httpClient = httpClientBuilder.build();
HttpGet httpGet = new HttpGet(inputurl);
返回信息如下:
{"code":"400","data":null,"msg":"请重新登录。"}
通过尝试说明此种方法不可行。需要先跳转到Https进行登录操作才行。
  • 遇到问题,想解决方法
先去了解了下跳转机制,从Http>Https>Http的过程中,session是不会丢失的。就是说用户登录时候通过http访问了首页,然后点击登录按钮,跳转到https协议下,输入用户名密码等信息,登录成功,在服务端session放入当前登录用户信息. 这种跳转方式不会出现session丢失情况。而session的保持是通过cookie来维持的,就是说服务端跟客户端的会话是通过浏览器每次提交的一个cookie来表示,这个cookie的key是JSESSIONID,value是session的id,所以需要获取登录时的cookie。
  • 第二次尝试
尝试通过Httpclient获取cookie, 但是因为http跳转过去的登录页链接(https://login.***.com/accounts/login/?uid=523f70387b3d42439905170931f34a65&next=/openid/%3Fopenid.ns%3Dhttp%253A%252F%252Fspecs.openid.net%252Fauth%252F2.0%26openid.claimed_id%.........,是动态变化的,放弃此种方法。
看下面代码:
HttpHost httpHost = new HttpHost("localhost");  
HttpGet httpGet = new HttpGet("/https/");  
HttpResponse response = httpClient.execute(httpHost,httpGet);  
if(HttpStatus.SC_OK==response.getStatusLine().getStatusCode()){  
    HttpEntity entity = response.getEntity();  
}  
httpGet = new HttpGet("/https/index.jsp?cookie=write");  
response = httpClient.execute(httpHost,httpGet);  
FileWriter fw = new FileWriter("C:/cookie.txt");   
//读取cookie并保存文件  
List cookies = ((AbstractHttpClient) httpClient).getCookieStore().getCookies(); 
  • 再度尝试
接着就想尝试不通过https接口,通过直接访问web页的形式,获取cookie,首先当然想到了很熟悉的selenium,可是selenium需要打开浏览器,不是很方便。后来就想到了htmlunit ,这是一款开源的java 页面分析工具,读取页面后,可以有效的使用htmlunit分析页面上的内容。项目可以模拟浏览器运行,是个没有界面的浏览器,运行速度也是非常迅速。
使用Htmlunit非常简单:
1.首先在Maven项目中添加配置项:
<dependency>
<groupId>net.sourceforge.htmlunit</groupId>
<artifactId>htmlunit</artifactId>
<version>2.15</version>
</dependency>
2.使用Htmlunit提取cookie:
final WebClient webClient = new WebClient(BrowserVersion.CHROME);
webClient.getOptions().setUseInsecureSSL(true);
webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setCssEnabled(false);
HtmlPage page = null;
page = webClient.getPage(loginUrl);
HtmlElement corpid = (HtmlElement) page.getElementById("id_corpid"); 
HtmlElement corppw = (HtmlElement) page.getElementById("id_corppw");
corpid.click();
String username = ph.readValue("userName");
corpid.type(username);
corppw.click();
String password = new String(dec.decodeBuffer(ph.readValue("password")));
corppw.type(password);
List loginBtn = (List) page.getByXPath("//div[@id='corp']/form/div[@]/button");
Page resultPage = loginBtn.get(0).click();
String EHRCookie = HtmlUnitUtil.getCookieHeader(webClient);
logger.info("获得openidpage cookie值: "+cookie);
return cookie;
执行会发现已经将cookie提取出来:
[INFO ]13:29:15,882,main,[Class]LoginUtil, [Method]getEHRCookie, 获得openidpage cookie值: JSESSIONID=8A1979AC21C24DD8622E41D89ABFF6F3.classa-***.org-8010; sessionid=23d2b3e737c34cb8d8898bbec94c6a11
3.接着在Httpclient中加载提取的cookie访问http接口:
//加载cookie
httpGet.addHeader(new BasicHeader("Cookie",cookie));
接着就可以不用管登录的过程用通常的方法,用Httpclient继续进行接口测试了。
  • 总结
在Https验证跳转到http的web系统的接口测试中,如果将Htmlunit和httpclient结合起来会简化登录验证过程,方便进行测试代码编写。

免责声明:文章转载自《Http自动跳转Https的接口测试实践》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇[BZOJ4569] [Luogu 3295] [SCOI2016]萌萌哒(并查集+倍增)(十三)MySQL锁机制下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

微信小程序接口测试时appid为空如何解决

一、web接口测试和app/微信小程序接口测试的区别 web接口一般是通过浏览器访问,app接口是通过手机端访问的,所以他们header头部请求是不一样的,一样的就是User Agent这个参数。 web请求的header请求中的User Agent以谷歌为例: MAC:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_1...

自定义标签

在实际的开发中,如为了简化JSP中出现大量的JSP脚本,那么我们需要使用标准标签库和EL表达式,但是和新标签库中提供的标签是有限的,不可能完全满足开发的需要。如:分页。因此需要学习如何自定义自己的标签库。 如果要实现自定义标签,那么需要如下几步: 编写标签处理类 需要继承或者实现相关的类或者接口 编写标签描述文件 该文件是一个XML文件,而且必须放在网站的...

cookie (浏览器缓存)

cookie 其实是个后端技术 指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常是经过加密的) 服务器本身是没有记录客户端身份的方法的。 以前是字字千金,一个域下只能设置几十个,而现在据说有5M(5兆) 对于前端来说,种cookie就是给document设置了一个叫做cookie的自定义属性,这个属性能被所有浏览器...

flask设置cookie,设置session,模拟用户认证、模拟管理后台admin、模拟用户logout --

设置cookie HTTP协议是无状态的,在一次请求响应结束后,服务器不会留下关于客户端状态的信息。但是对于某些web程序来说,客户端的信息有必要被记住,比如用户的登录状态,这样就可以根据用户的状态来返回不同的响应。为了解决这个问题就有cookie技术 。cookie技术通过在请求和响应报文中添加cookie数据来保存客户端的状态信息。 cookie值we...

物理机安装ESXI6.7提示No Network Adapters的解决方案

下载好ESXI6.7.iso镜像,写入U盘后,提示No Network Adapters,找不到网卡驱动。 解决办法:需要重新封装ESXI,将对应的网卡驱动嵌入进来。 1、先下载VMware-PowerCLI-6.5.0和ESXi-Customizer-PS: http://down.whsir.com/downloads/VMware-PowerCLI...

Unity灯光详解

Lights will bring personality and flavor to your game. You use lights to illuminate the scenes and objects to create the perfect visual mood. Lights can be used to simulate the s...