HttpClient 模拟登陆,保持会话并进行后续操作

Apache HttpClient 是很方便的 Java 开源的访问 HTTP 资源的组件。网站上的资源不总是能匿名访问的,很多都需要登陆后才能操作,且不说论坛里登陆后才能发言,就是某些稍显敏感的 XML 等信息也是登陆后才能获取到的。

没问题,HttpClient 能让你做到,它提供了 Basic 和 Form-Based 两种验证方式。登陆后获得服务器端发来的 Cookie 作为下一次访问的凭证, 让服务端认为你还是个合法用户。服务端不是用 Session 来维护会话的吗?是的,Session 也要有个载体,Cookie 了。或有时 Java Web 会用 jsessionid 参数在服务端与客户端来回关联 Session 信息,也没问题,HttpClient 同样能胜任。

下面主要说明 Form-Based 的验证方式,Basic 的验证简单列了几行代码,还未实践,具体可参考文后的链接。

看 Form-Based 方式的演示代码,如果登陆时需要一个验证码的话,那只有自己想办法怎么得到这个码了,登陆时谁都想无码:
 1package cc.unmi.httpclient;
 2
 3import org.apache.commons.httpclient.Cookie;
 4import org.apache.commons.httpclient.HttpClient;
 5import org.apache.commons.httpclient.NameValuePair;
 6import org.apache.commons.httpclient.cookie.CookiePolicy;
 7import org.apache.commons.httpclient.methods.GetMethod;
 8import org.apache.commons.httpclient.methods.PostMethod;
 9import org.junit.Test;
10
11public class HttpClientLogin {
12
13    public static void main(String[] args){
14        //登陆 Url
15        String loginUrl = "http://localhost/unmi/login.html";
16
17        //需登陆后访问的 Url
18        String dataUrl = "http://localhost/unmi/user_info.html?userid=123456";
19
20        HttpClient httpClient = new HttpClient();
21
22        //模拟登陆,按实际服务器端要求选用 Post 或 Get 请求方式
23        PostMethod postMethod = new PostMethod(loginUrl);
24
25        //设置登陆时要求的信息,一般就用户名和密码,验证码自己处理了
26        NameValuePair[] data = {
27                new NameValuePair("username", "Unmi"),
28                new NameValuePair("password", "123456"),
29                new NameValuePair("code", "anyany")
30        };
31        postMethod.setRequestBody(data);
32
33        try {
34            //设置 HttpClient 接收 Cookie,用与浏览器一样的策略
35            httpClient.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
36            httpClient.executeMethod(postMethod);
37
38            //获得登陆后的 Cookie
39            Cookie[] cookies=httpClient.getState().getCookies();
40            String tmpcookies= "";
41            for(Cookie c:cookies){
42                tmpcookies += c.toString()+";";
43            }
44
45            //进行登陆后的操作
46            GetMethod getMethod = new GetMethod(dataUrl);
47
48            //每次访问需授权的网址时需带上前面的 cookie 作为通行证
49            getMethod.setRequestHeader("cookie",tmpcookies);
50
51            //你还可以通过 PostMethod/GetMethod 设置更多的请求后数据
52            //例如,referer 从哪里来的,UA 像搜索引擎都会表名自己是谁,无良搜索引擎除外
53            postMethod.setRequestHeader("Referer", "http://unmi.cc");
54            postMethod.setRequestHeader("User-Agent","Unmi Spot");
55
56            httpClient.executeMethod(getMethod);
57
58            //打印出返回数据,检验一下是否成功
59            String text = getMethod.getResponseBodyAsString();
60            System.out.println(text);
61
62        } catch (Exception e) {
63            e.printStackTrace();
64        }
65    }
66}
Basic 验证的简单代码导引,还未亲试:
 1HttpClient client = new HttpClient();
 2
 3// 1
 4client.getState().setCredentials(
 5    new AuthScope("unmi.cc", 80, AuthScope.ANY_REALM),
 6    new UsernamePasswordCredentials("username", "password")
 7);
 8
 9// 2
10client.getParams().setAuthenticationPreemptive(true);
11
12// 3
13GetMethod getMothod = new GetMethod("http://unmi.cc/twitter");
14
15// 4
16getMothod.setDoAuthentication( true );
17
18// 5
19int status = client.executeMethod( getMothod );
参考:1. ZT---httpclient如何保持session会话模拟登录后的操作 
         2. 使用 Apache HttpClient 突破 J2EE 站点认证  
        3. 官方例子,BasicAuthenticationExample.java 永久链接 https://yanbin.blog/httpclient-login-session/, 来自 隔叶黄莺 Yanbin's Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。