当前位置: 代码迷 >> J2SE >> HttpClient 模拟登录后怎么保持session
  详细解决方案

HttpClient 模拟登录后怎么保持session

热度:117   发布时间:2016-04-24 12:33:58.0
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("提交成功!");                    }    }
  相关解决方案