HTTP连接如何保持登录状态?OkHttp或者HttpClient

上节我们讲过HTTP客户端,基于它们的优劣势,一般使用OkHttp或者HttpClient。所以这节我们主要针对这两个HTTP客户端实现登录一直保持功能。

OkHttp

设置cookie请求消息头的方式还可以实现身份认证功能。

 1 // 创建HTTP客户端
 2 OkHttpClient client = new OkHttpClient.Builder()
 3         .cookieJar(new CookieJar() {
 4             // 使用ConcurrentMap存储cookie信息,因为数据在内存中,所以只在程序运行阶段有效,程序结束后即清空
 5             private ConcurrentMap<String, List<Cookie>> storage = new ConcurrentHashMap<>();
 6 
 7             @Override
 8             public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
 9                 String host = url.host();
10                 if (cookies != null && !cookies.isEmpty()) {
11                     storage.put(host, cookies);
12                 }
13             }
14 
15             @Override
16             public List<Cookie> loadForRequest(HttpUrl url) {
17                 String host = url.host();
18                 List<Cookie> list = storage.get(host);
19                 return list == null ? new ArrayList<>() : list;
20             }
21         })
22         .build();
23 
24 final String userAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36";
25 
26 // 模拟表单登录
27 Request request = new Request.Builder()
28         .url("https://www.oschina.net/action/user/hash_login?from=")
29         .post(new FormBody.Builder()
30                 .add("email", "修改为你自己的帐号")
31                 .add("pwd", "修改为你自己的密码,使用SHA-1加密")
32                 .add("verifyCode", "")
33                 .add("save_login", "1")
34                 .build())
35         .addHeader("User-Agent", userAgent)
36         .build();
37 
38 // 执行模拟登录请求
39 Response response = client.newCall(request).execute();
40 
41 // response status
42 if (!response.isSuccessful()) {
43     log.info("code = {}, message = {}", response.code(), response.message());
44     return;
45 } else {
46     log.info("登录成功 !");
47 }
48 
49 
50 // 请求包含用户状态信息的网页,观察能否正确请求并取得状态信息
51 request = new Request.Builder()
52         .url("https://www.oschina.net/")
53         .addHeader("User-Agent", userAgent)
54         .get()
55         .build();
56 
57 // 执行GET请求,并在异步回调中处理请求
58 response = client.newCall(request).execute();
59 
60 // 打印登录用户名,验证是否获取到了用户的登录信息(状态信息)
61 if (response.isSuccessful()) {
62     String content = response.body().string();
63 
64     Matcher matcher = Pattern.compile("<span class="name">(.*)</span>,您好&nbsp;").matcher(content);
65     if (matcher.find()) {
66         log.info("登录用户:{}", matcher.group(1));
67     } else {
68         log.info("用户未登录");
69     }
70 
71 }

HttpClient

 1 import org.apache.http.NameValuePair;
 2 import org.apache.http.client.entity.UrlEncodedFormEntity;
 3 import org.apache.http.client.methods.CloseableHttpResponse;
 4 import org.apache.http.client.methods.HttpGet;
 5 import org.apache.http.client.methods.HttpPost;
 6 import org.apache.http.impl.client.CloseableHttpClient;
 7 import org.apache.http.impl.client.HttpClients;
 8 import org.apache.http.message.BasicNameValuePair;
 9  
10 import java.io.BufferedReader;
11 import java.io.IOException;
12 import java.io.InputStream;
13 import java.io.InputStreamReader;
14 import java.util.ArrayList;
15 import java.util.List;
16  
17 public class Test  {
18  
19     public static void main(String[] args) throws IOException {
20         InputStreamReader inputStreamReader = null;
21         BufferedReader reader = null;
22         String line = null;
23         //两个页面参数
24         //据我观察这个url不变
25         String backUrl = "http%3A%2F%2Fredmine.tvbanywhere.net%2Fredmine%2F";
26         String authenticityToken = null;
27  
28         //创建httpclient对象
29         CloseableHttpClient httpClient = HttpClients.createDefault();
30  
31         //get请求访问这个url是页面
32         //获取auth_token
33         HttpGet getParam = new HttpGet("http://redmine.tvbanywhere.net/redmine/login");
34         CloseableHttpResponse response1 = httpClient.execute(getParam);
35         InputStream inputStream1 = response1.getEntity().getContent();
36         inputStreamReader = new InputStreamReader(inputStream1);
37         reader = new BufferedReader(inputStreamReader);
38         while ((line = reader.readLine())!= null){
39             if (line.contains("name="authenticity_token"")){
40                 System.out.println(line);
41                 String sub1 = line.substring(line.indexOf("value="") + 7);
42                 authenticityToken = sub1.substring(0, sub1.indexOf("""));
43             }
44         }
45         reader.close();
46         inputStreamReader.close();
47         inputStream1.close();
48         //post 请求是登录操作
49         HttpPost dologin = new HttpPost("http://redmine.tvbanywhere.net/redmine/login");
50         List<NameValuePair> list = new ArrayList<NameValuePair>();
51         list.add(new BasicNameValuePair("authenticity_token",authenticityToken));
52         list.add(new BasicNameValuePair("back_url",backUrl));
53         list.add(new BasicNameValuePair("username","zhongxiaojian@sunniwell.net"));
54         list.add(new BasicNameValuePair("password","zhongxiaojian@sunniwell.net"));
55         UrlEncodedFormEntity urlEncodedFormEntity = null;
56         urlEncodedFormEntity = new UrlEncodedFormEntity(list);
57         dologin.setEntity(urlEncodedFormEntity);
58         CloseableHttpResponse response2 = httpClient.execute(dologin);
59  
60         HttpGet get1 = new HttpGet("http://redmine.tvbanywhere.net/redmine/search?issues=1&q=howard.tang@tvb.com.hk");
61         CloseableHttpResponse response3 = httpClient.execute(get1);
62         System.err.println("get" + get1.getURI());
63         InputStream inputStream3 = response3.getEntity().getContent();
64         inputStreamReader = new InputStreamReader(inputStream3);
65         reader = new BufferedReader(inputStreamReader);
66         while ((line = reader.readLine()) != null){
67             System.out.println(line);
68         }
69     }
70 }
原文地址:https://www.cnblogs.com/ivy-xu/p/12873549.html