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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM