zoukankan      html  css  js  c++  java
  • Http自动跳转Https的接口测试实践

    日前,需要做一个接口测试,对象是一个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结合起来会简化登录验证过程,方便进行测试代码编写。
  • 相关阅读:
    java中复制图片
    java中复制图片
    java中替换文件内容
    java中替换文件内容
    java中替换文件内容
    java中复制文本文件
    mac 地址分配
    data standardization
    Orthogonal Least Squares Learning Algorithm for Radial Basis Function Networks
    算法设计 mac 字符串 标识 n维度 2 3维度 字符串 标识值 特征值
  • 原文地址:https://www.cnblogs.com/appstest/p/4962336.html
Copyright © 2011-2022 走看看