HttpClient 模拟登陆,保持会话并进行后续操作
Apache HttpClient 是很方便的 Java 开源的访问 HTTP 资源的组件。网站上的资源不总是能匿名访问的,很多都需要登陆后才能操作,且不说论坛里登陆后才能发言,就是某些稍显敏感的 XML 等信息也是登陆后才能获取到的。
没问题,HttpClient 能让你做到,它提供了 Basic 和 Form-Based 两种验证方式。登陆后获得服务器端发来的 Cookie 作为下一次访问的凭证, 让服务端认为你还是个合法用户。服务端不是用 Session 来维护会话的吗?是的,Session 也要有个载体,Cookie 了。或有时 Java Web 会用 jsessionid 参数在服务端与客户端来回关联 Session 信息,也没问题,HttpClient 同样能胜任。
下面主要说明 Form-Based 的验证方式,Basic 的验证简单列了几行代码,还未实践,具体可参考文后的链接。
看 Form-Based 方式的演示代码,如果登陆时需要一个验证码的话,那只有自己想办法怎么得到这个码了,登陆时谁都想无码:
Basic 验证的简单代码导引,还未亲试:
参考: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) 进行许可。
没问题,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} 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 );2. 使用 Apache HttpClient 突破 J2EE 站点认证
3. 官方例子,BasicAuthenticationExample.java 永久链接 https://yanbin.blog/httpclient-login-session/, 来自 隔叶黄莺 Yanbin's Blog
[版权声明]
本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。