日前,需要做一个接口测试,对象是一个web网站,登录的时候用ssl连接,登录进入系统后自动转成普通的http连接。
  这种类型的web网站很常见,既保证了登录时的安全,也避免了整个系统使用ssl带来的系统性能下降的问题。
  我们把整个访问过程分解如下:
  访问web首页(http的): http://***.com/
  登录用ssl连接: https://login.***.com;
  再返回http: http://***.com/common/getInfo.do?***;
  那进行接口测试应该怎么做呢?
  初步尝试
  一般一个http接口拿来,基本上直接用Httpclient行访问,进行接口测试。
  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":"请重新登录。"}
  通过尝试说明此种方法不可行。需要先登录才行。
  再去了解了下跳转机制,从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<Cookie> cookies = ((AbstractHttpClient) httpClient).getCookieStore().getCookies();