返回
多用户同时在线:httpclient如何应对?
见解分享
2023-10-09 17:55:25
在使用httpclient做接口相关测试的过程中,遇到过一个障碍:如何处理多用户同时登陆。之前用户身份凭证一般都是做公参里面处理或者在header中单独定义一个或者几个字段,cookie都是使用httpclient自带的管理器自动管理的。
后来用户凭证存到了cookie里,这里就遇到了一个问题,在进行并发请求的时候,每个线程都是独立的,相互之间不共享cookie,那么如何才能保证每个用户都能获取到自己的cookie呢?
一个办法就是利用HttpClient的线程安全特性,让多个线程共享同一个HttpClient对象,这样就可以保证每个线程都能获取到自己的cookie。
HttpClient httpClient = new HttpClient();
//设置cookie策略
httpClient.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.BROWSER_COMPATIBILITY);
//设置用户凭证
httpClient.getState().addCookie(new BasicClientCookie("username", "zhangsan"));
httpClient.getState().addCookie(new BasicClientCookie("password", "123456"));
另一个办法是利用httpclient的线程池来管理线程,这样就可以保证每个线程都能获取到自己的HttpClient对象。
ExecutorService executorService = Executors.newFixedThreadPool(10);
for (int i = 0; i < 100; i++) {
executorService.submit(new Runnable() {
@Override
public void run() {
HttpClient httpClient = new HttpClient();
//设置cookie策略
httpClient.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.BROWSER_COMPATIBILITY);
//设置用户凭证
httpClient.getState().addCookie(new BasicClientCookie("username", "zhangsan"));
httpClient.getState().addCookie(new BasicClientCookie("password", "123456"));
//执行请求
HttpGet httpGet = new HttpGet("http://localhost:8080/login");
HttpResponse httpResponse = httpClient.execute(httpGet);
}
});
}
executorService.shutdown();
除了上面两种方法之外,还可以利用负载均衡器来分发请求,这样就可以将请求均匀地分配到不同的服务器上,避免单台服务器压力过大。
负载均衡器 --> 服务器1 --> 用户1
负载均衡器 --> 服务器2 --> 用户2
负载均衡器 --> 服务器3 --> 用户3
总之,httpclient在处理多用户同时在线时,可以通过利用cookie和session实现用户身份验证、采用多线程和负载均衡提高并发性能等方法来解决问题。