日期:2014-05-20  浏览次数:20931 次

HttpClient 模拟登录后如何保持session
Java code

HttpClient client = new HttpClient();

        client.getHostConfiguration().setHost( "localhost" , 7001, "http" );

        /**
         * 模拟登陆门户系统
         */
        PostMethod post = new PostMethod( "/wwt/login" );
        NameValuePair name = new NameValuePair( "username" , "pengxl");
        NameValuePair pass = new NameValuePair( "password" , "qqqq");
        post.setRequestBody( new NameValuePair[]{name,pass});
        client.executeMethod(post);
        
        /**
         * 登录后的相关跳转
         */
        System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
        int status = post.getStatusCode();
        boolean flag = true;
        if ((status == HttpStatus.SC_MOVED_TEMPORARILY) ||
                (status == HttpStatus.SC_MOVED_PERMANENTLY) ||
                (status == HttpStatus.SC_SEE_OTHER) ||
                (status == HttpStatus.SC_TEMPORARY_REDIRECT)){
            flag = true;
        }else{
            flag = false;
        }
        GetMethod get = new GetMethod();
        int i = 0;
        while(flag){
            i++;
                System.out.println("第"+i+"步");
             Header header = post.getResponseHeader("location");
             if (header != null) {
                 String newuri = header.getValue();
                 if ((newuri == null) || (newuri.equals("")))
                                           newuri = "/";
                 get=new GetMethod(newuri);    
//                 get.setRequestHeader("Cookie",cookies.toString()); 
                 client.executeMethod(get);
//                 cookies=client.getState().getCookies();
                 status = get.getStatusCode();
                 if ((status == HttpStatus.SC_MOVED_TEMPORARILY) ||
                            (status == HttpStatus.SC_MOVED_PERMANENTLY) ||
                            (status == HttpStatus.SC_SEE_OTHER) ||
                            (status == HttpStatus.SC_TEMPORARY_REDIRECT)){
                        flag = true;
                    }else{
                        flag = false;
                    }
             } 
        }
        HttpParams httpParams = client.getParams();
        
        String htmlvalue = new String(get.getResponseBodyAsString());
        PrintWriter out = response.getWriter();
        out.write(htmlvalue);



上面方法实现了A系统对B系统的登录,并且把登录后最终的页面输出到了A系统中,
现在存在一个问题,输出后的页面 session中不存在B系统需要的session,因此无法对该页面进一步操作,请教如何把HttpClient中的session内容取出并放到A系统中?

------解决方案--------------------
下次请求时把前面请求获得的cookie再发回去就行了。
------解决方案--------------------
登录成功后,HttpClient会保存cookie,
 CookieSpec cookiespec = CookiePolicy.getDefaultSpec();
 Cookie[] cookies = cookiespec.match(cookie_key, port, "/" , false , client.getState().getCookies());
具体的实现,你可以上网上查一下,
cookie_key 是你要用的cookie, port 是端口号,
------解决方案--------------------
Java code

public static void main(String[] args) {
        HttpClient client = new HttpClient();
        NameValuePair[] nameValuePairs = {
                new NameValuePair("username", "aaa"),
                new NameValuePair("passwd", "123456")
        };
        PostMethod postMethod = new PostMethod("登录url");
        postMethod.setRequestBody(nameValuePairs);
        int stats = 0;
        try {
            stats = client.executeMethod(postMethod);
        } catch (HttpException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        postMethod.releaseConnection();//这里最好把之前的资源放掉
        CookieSpec cookiespec = CookiePolicy.getDefaultSpec();
        Cookie[] cookies = cookiespec.match("域名", 80/*端口*/, "/" , false , client.getState().getCookies());
        for (Cookie cookie : cookies) {
            System.out.println(cookie.getName() + "##" + cookie.getValue());
        }
        
        HttpMethod method = null;
        String encode = "utf-8";//页面编码,按访问页面改动
        String referer = "http://域名";//http://www.163.com
        method = new GetMethod("url2");//后续操作
        method.getParams().setParameter("http.useragent","Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)");
        method.setRequestHeader("Referer", referer);

        client.getParams().setContentCharset(encode);
        client.getParams().setSoTimeout(300000);
        client.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(10, true));
  
        try {
            stats = client.executeMethod(method);
        } catch (HttpException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (stats == HttpStatus.SC_OK) {
            System.out.println("提交成功!");
            
        }
    }