上節我們講過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>,您好 ").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 }