这种类型的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(); |