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結合起來會簡化登錄驗證過程,方便進行測試代碼編寫。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM