今天想写个模拟web登陆的压力测试代码,首先想到的是 httpclient
因为做压力测试没必要模拟页面操作,只要对server造成loading就行了。
公司的系统架构是SSH的,我的想法是先用n个client登陆SSO,然后把n个client扔到n个线程,然后n个线程一起start.
开始一直报CircularRedirectException的exception. debug发现一直在尝试登陆。
就怀疑是cookie
功能有问题,因为用IE登陆会在cookie
目录生成cookie
文件,但
是模拟登陆却没有。
中间的问题研究就不多说了,结论并不是cookie
的问题,而是httpclient
executeMethod时会判断执行过的action再执行就抛出CircularRedirectException。
解决方法就是重写啦。
重载CustHttpMethodDirector
processRedirectResponse function remark掉下面这段
/* if (this.redirectLocations.contains(redirectUri)) {
throw new CircularRedirectException("Circular
redirect to '" +
redirectUri + "'");
}*/
代码贴出来供参考。
[code=java]
private static final Log log = LogFactory.getLog(Test.class);
public void test() throws InterruptedException {
System.setProperty("apache.commons.httpclient
.cookiespec","COMPATIBILITY");
List userList = initUserList();
List userList2 = initUserList2();
List userActionList = new ArrayList();
//init group 1
for (Iterator iter = userList.iterator(); iter.hasNext();) {
String empNo = (String) iter.next();
HttpClient
client =
userLogin(empNo);
userActionList.add(getUserAction1(empNo,client));
}
//init group 2
for (Iterator iter = userList2.iterator(); iter.hasNext();) {
String empNo = (String) iter.next();
HttpClient
client =
userLogin(empNo);
userActionList.add(getUserAction2(empNo,client));
}
log.info("---------------------start
action------------------------");
// start batch do
for (Iterator iter = userActionList.iterator();
iter.hasNext();) {
UrlOperation urlOperation = (UrlOperation) iter.next();
urlOperation.start();
}
Thread.sleep(100000000);
}
public UrlOperation getUserAction1(String empNo,HttpClient
client){
List parameters = new ArrayList();
return new UrlOperation(empNo,
"http://fffff:8086/sys/fff/todo.action", null, client);
}
public UrlOperation getUserAction2(String empNo,HttpClient
client){
List parameters = new ArrayList();
parameters.add(new NameValuePair("bomFormId", "181"));
return new UrlOperation(empNo,
"http://fffff:8086/sys/fff/viewBomRequestForm.action", parameters,
client);
}
private List initUserList() {
List list = new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");
list.add("eee");
return list;
}
private List initUserList2() {
List list = new ArrayList();
list.add("aaaa");
list.add("aaaaaa");
list.add("bbbbbbb");
list.add("vvvvv");
return list;
}
public HttpClient
userLogin(String
empId) {
HttpClient
client =
getClient();
List parameters = new ArrayList();
parameters.add(new NameValuePair("userLoginId", empId));
parameters.add(new NameValuePair("password", "111111"));
doInClient(empId, "http://aaaaaa:8888/sso/login.action",
parameters, client); return client;
}
public void doInClient(String empId, String url, List
parameterList, HttpClient
client) {
Date date = new Date();
GetMethod authpost = new GetMethod(url);
// Prepare login parameters
if (parameterList != null)
authpost.setQueryString((NameValuePair[])
parameterList.toArray(new NameValuePair[parameterList.size()]));
authpost.setFollowRedirects(true);
try {
client.executeMethod(authpost);
//log.info(authpost.getResponseBodyAsString());
Cookie
[]
cookies=client.getState().getCookies();
client.getState().addCookies(cookies);
authpost.releaseConnection();
} catch (HttpException e) {
log.error(e);
} catch (IOException e) {
log.error(e);
}
System.out.println("Action " + url + " run time:" + ((new
Date()).getTime() - date.getTime()));
}
public HttpClient
getClient() {
CustHttpClient client = new CustHttpClient();
client.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
client.getParams().setIntParameter(HttpClientParams.MAX_REDIRECTS, 20);
return client;
}
class UrlOperation extends Thread {
private String url;//
private String empId;
private List parameterList = new ArrayList();
private HttpClient
client;
public UrlOperation(String empId, String url, List
parameters, HttpClient
client) {
this.url = url;
this.empId = empId;
if (parameters != null)
parameterList.addAll(parameters);
this.client = client;
}
public void run() {
Date date = new Date();
GetMethod get = new GetMethod(url);
get.setQueryString((NameValuePair[])
parameterList.toArray(new NameValuePair[parameterList.size()]));
get.setFollowRedirects(true);
try {
client.executeMethod(get);
//log.info(get.getResponseBodyAsString());
get.releaseConnection();
} catch (HttpException e) {
log.error(e);
} catch (IOException e) {
log.error(e);
}
System.out.println("Action " + url + " run time:" +
((new Date()).getTime() - date.getTime()));
}
}
分享到:
相关推荐
在这个场景中,我们关注的是如何使用`httpclient`进行模拟登录并携带cookie来访问后续的URL。这个过程通常涉及到处理session和身份验证,对于开发需要登录功能的Web应用或自动化测试脚本尤其有用。 首先,`...
6. **设置HttpClient的Cookie管理器**:将CookieStore与HttpClient关联,以便在后续请求中自动添加Cookie。 ```java RequestConfig config = RequestConfig.custom().setCookieSpec(CookieSpecs.DEFAULT).build(); ...
在C#编程中,`HttpClient`是用于发送HTTP请求的重要类,但默认情况下,它并不支持处理Cookie,这在需要保持会话状态或进行身份验证的场景中可能成为一个问题。本文将深入探讨如何在C#中使用`HttpClient`处理Cookie...
delphi操作NetHTTPClient读写cookie例子
HttpClient库允许开发者执行各种HTTP方法(如GET、POST、PUT等),处理重定向、认证、cookie管理等复杂网络交互,同时提供了线程安全和高效的连接管理机制。这个库在处理Web服务API、爬虫程序或任何需要与HTTP服务器...
httpclient 请求两种方式,如果有cookie可加上cookies,同步获取返回值
除了基本的GET和POST,HttpClient还支持PUT、DELETE等其他HTTP方法,以及更复杂的特性,如HTTP连接管理、重试策略、身份验证、Cookie处理等。 网络协议方面,HttpClient遵循HTTP/1.1标准,并且可以与HTTPS(即安全...
5. **Cookie管理**:HttpClient可以自动处理服务器返回的cookies,保持会话状态,方便处理登录和其他需要保持状态的场景。 6. **异步请求**:虽然HttpClient主要是同步操作,但通过配合线程或者回调机制,可以实现...
8. **Cookie管理**:HttpClient有一个内置的Cookie管理器,可以处理服务器返回的Cookie,并在后续请求中自动发送。 9. **拦截器**:HttpClient允许你插入请求和响应拦截器,可以在发送请求前或接收响应后进行自定义...
4. **Cookie管理**:HttpClient内置了Cookie管理器,可以处理服务器返回的Cookie,保持会话状态,支持标准的Cookie规范。 5. **SSL/TLS支持**:HttpClient支持安全的HTTPS通信,可以自定义SSL上下文,处理证书、...
5. **异常处理**:HttpClientHelper 应该包含了适当的错误处理机制,如捕获网络异常、解析异常等,以确保在出现问题时能够给出适当的反馈。 6. **HTTP请求配置**:可能还提供了设置超时、添加HTTP头、携带Cookie等...
HttpClient还支持更复杂的用法,如POST请求、文件上传、Cookie管理、HTTPS通信、自定义连接管理器等。通过深入学习HttpClient,你可以更灵活地处理与Web服务器的交互,实现各种复杂的网络功能。
在执行请求时,HttpClient会自动处理收到的Cookie,并在后续请求中添加适当的Cookie头。 在文件上传方面,HttpClient3.1 提供了`MultipartRequestEntity`类,允许你构建包含多个部分(如文件和文本字段)的POST请求...
http://jakarta.apache.org/commons/httpclient/ org.apache.commons.httpclient.URI org.apache.commons.httpclient.Wire org.apache.commons.httpclient.Cookie org.apache.commons.httpclient.Header org.apache....
- HttpClient threadsafety讨论了HttpClient的线程安全问题。 - HttpClient resource deallocation关注了资源释放的问题。 3. HTTP execution context则是关于HTTP执行上下文的介绍,它为HTTP交互提供了运行时上...
8. **Cookie Management**:对于处理需要维持会话的HTTP请求,HttpClient支持Cookie管理,可以设置`CookieStore`和`CookiePolicy`。 9. **Authentication**:HttpClient支持多种认证机制,包括基本认证、NTLM、...
5. **Cookie管理**:HttpClient 的`CookieStore`和`CookiePolicy`接口帮助管理Cookie,支持标准的Cookie协议,并能根据策略决定接受哪些Cookie。 6. **认证**:HttpClient 支持多种认证机制,包括基本认证、摘要...
5. **支持Cookie管理**:HttpClient能够自动处理服务器返回的Cookie,保持会话状态。 6. **代理设置**:支持配置HTTP代理和SOCKS代理,适应不同网络环境的需求。 7. **安全通信**:通过SSL/TLS协议支持HTTPS,确保...