`
gstarwd
  • 浏览: 1524740 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

HttpClient cookie的问题

阅读更多

 今天想写个模拟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()));
        }
    }

分享到:
评论

相关推荐

    httpUtil httpclient 登陆携带cookie访问下一个连接

    在这个场景中,我们关注的是如何使用`httpclient`进行模拟登录并携带cookie来访问后续的URL。这个过程通常涉及到处理session和身份验证,对于开发需要登录功能的Web应用或自动化测试脚本尤其有用。 首先,`...

    Java 使用HttpClient保持SESSION状态

    6. **设置HttpClient的Cookie管理器**:将CookieStore与HttpClient关联,以便在后续请求中自动添加Cookie。 ```java RequestConfig config = RequestConfig.custom().setCookieSpec(CookieSpecs.DEFAULT).build(); ...

    C# HttpClient Cookie验证解决方法

    在C#编程中,`HttpClient`是用于发送HTTP请求的重要类,但默认情况下,它并不支持处理Cookie,这在需要保持会话状态或进行身份验证的场景中可能成为一个问题。本文将深入探讨如何在C#中使用`HttpClient`处理Cookie...

    delphi操作NetHTTPClient读写cookie例子

    delphi操作NetHTTPClient读写cookie例子

    httpclient请求方式+cookies

    httpclient 请求两种方式,如果有cookie可加上cookies,同步获取返回值

    httpclient.jar包下载

    HttpClient库允许开发者执行各种HTTP方法(如GET、POST、PUT等),处理重定向、认证、cookie管理等复杂网络交互,同时提供了线程安全和高效的连接管理机制。这个库在处理Web服务API、爬虫程序或任何需要与HTTP服务器...

    httpclient.jar包下载.zip

    除了基本的GET和POST,HttpClient还支持PUT、DELETE等其他HTTP方法,以及更复杂的特性,如HTTP连接管理、重试策略、身份验证、Cookie处理等。 网络协议方面,HttpClient遵循HTTP/1.1标准,并且可以与HTTPS(即安全...

    org.apache.commons.httpclient相关架包

    5. **Cookie管理**:HttpClient可以自动处理服务器返回的cookies,保持会话状态,方便处理登录和其他需要保持状态的场景。 6. **异步请求**:虽然HttpClient主要是同步操作,但通过配合线程或者回调机制,可以实现...

    httpClient需要的jar包

    8. **Cookie管理**:HttpClient有一个内置的Cookie管理器,可以处理服务器返回的Cookie,并在后续请求中自动发送。 9. **拦截器**:HttpClient允许你插入请求和响应拦截器,可以在发送请求前或接收响应后进行自定义...

    Httpclient依赖包

    4. **Cookie管理**:HttpClient内置了Cookie管理器,可以处理服务器返回的Cookie,保持会话状态,支持标准的Cookie规范。 5. **SSL/TLS支持**:HttpClient支持安全的HTTPS通信,可以自定义SSL上下文,处理证书、...

    httpclient httpclient.jar

    HttpClient还支持更复杂的用法,如POST请求、文件上传、Cookie管理、HTTPS通信、自定义连接管理器等。通过深入学习HttpClient,你可以更灵活地处理与Web服务器的交互,实现各种复杂的网络功能。

    HttpClientHelper 工具类

    5. **异常处理**:HttpClientHelper 应该包含了适当的错误处理机制,如捕获网络异常、解析异常等,以确保在出现问题时能够给出适当的反馈。 6. **HTTP请求配置**:可能还提供了设置超时、添加HTTP头、携带Cookie等...

    HttpClient3.1 学习整理

    在执行请求时,HttpClient会自动处理收到的Cookie,并在后续请求中添加适当的Cookie头。 在文件上传方面,HttpClient3.1 提供了`MultipartRequestEntity`类,允许你构建包含多个部分(如文件和文本字段)的POST请求...

    commons-httpclient-3.1jar包下载

    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

    - HttpClient threadsafety讨论了HttpClient的线程安全问题。 - HttpClient resource deallocation关注了资源释放的问题。 3. HTTP execution context则是关于HTTP执行上下文的介绍,它为HTTP交互提供了运行时上...

    httpClienthttpClient

    8. **Cookie Management**:对于处理需要维持会话的HTTP请求,HttpClient支持Cookie管理,可以设置`CookieStore`和`CookiePolicy`。 9. **Authentication**:HttpClient支持多种认证机制,包括基本认证、NTLM、...

    httpclient-4.5.3 api 中文版

    5. **Cookie管理**:HttpClient 的`CookieStore`和`CookiePolicy`接口帮助管理Cookie,支持标准的Cookie协议,并能根据策略决定接受哪些Cookie。 6. **认证**:HttpClient 支持多种认证机制,包括基本认证、摘要...

    httpclient4.2.1.zip

    5. **支持Cookie管理**:HttpClient能够自动处理服务器返回的Cookie,保持会话状态。 6. **代理设置**:支持配置HTTP代理和SOCKS代理,适应不同网络环境的需求。 7. **安全通信**:通过SSL/TLS协议支持HTTPS,确保...

Global site tag (gtag.js) - Google Analytics