import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; public class HttpClient4ITEYELogin { private CloseableHttpClient httpClient = HttpClients.createDefault(); private String getAuthenticity_token(String html) { Document doc = Jsoup.parse(html); return doc.select("form#login_form input[name=authenticity_token]") .attr("value"); } /** * 获取iTeye登录页面 * * @param url * @return * @throws IOException * @throws ClientProtocolException */ private String getITEyePageContent(String url) throws Exception { StringBuffer result = new StringBuffer(); // 设置请求信息 HttpGet request = new HttpGet(url); request.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0"); request.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); request.setHeader("Accept-Language", "zh-CN,zh;q=0.8,en-GB;q=0.6,en;q=0.4,zh-TW;q=0.2"); // 发送请求 HttpResponse response = httpClient.execute(request); int statusCode = response.getStatusLine().getStatusCode(); // statusCode==200表示请求成功. System.out.println("\nSending 'GET' request to URL : " + url); System.out.println("Response Code : " + statusCode); // 读取返回内容解析成字符串 BufferedReader br = new BufferedReader(new InputStreamReader(response .getEntity().getContent(), "utf-8")); String line = ""; while ((line = br.readLine()) != null) { result.append(line); } //关闭资源 br.close(); return result.toString(); } /** * 设置请求头 * */ public void setRequestHeader(HttpUriRequest request) { request.setHeader("Host", "www.iteye.com"); request.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0"); request.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); request.setHeader("Accept-Language", "zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3"); request.setHeader("Accept-Encoding", "gzip, deflate"); request.setHeader("Referer", "http://www.iteye.com/login"); request.setHeader("Connection", "keep-alive"); } private List<NameValuePair> getParameters(String username, String password) throws Exception { List<NameValuePair> parameters = new ArrayList<NameValuePair>(); parameters.add(new BasicNameValuePair("name", username)); parameters.add(new BasicNameValuePair("password", password)); parameters .add(new BasicNameValuePair( "authenticity_token", getAuthenticity_token(getITEyePageContent("http://www.iteye.com/login")))); parameters.add(new BasicNameValuePair("remember_me", "1")); return parameters; } public void login(String url, String username, String password) throws Exception { HttpPost httpPost = new HttpPost(url); setRequestHeader(httpPost); // 设置请求参数 List<NameValuePair> parameters = getParameters(username, password); HttpEntity httpEntity = new UrlEncodedFormEntity(parameters); System.out.println("send parameters: " + parameters); httpPost.setEntity(httpEntity); HttpResponse response = httpClient.execute(httpPost); // 状态码 System.out.println("StatesCode:" + response.getStatusLine().getStatusCode()); BufferedReader br = new BufferedReader(new InputStreamReader(response .getEntity().getContent(), "utf-8")); StringBuffer sb = new StringBuffer(); while (br.ready()) { sb.append(br.readLine()); } // 打印HTML System.out.println(sb.toString()); // 关闭资源 br.close(); } public static void main(String[] args) throws Exception { // 打开cookie HttpClient4ITEYELogin httpClient4ITEYELogin = new HttpClient4ITEYELogin(); httpClient4ITEYELogin.getITEyePageContent("http://www.iteye.com/login"); httpClient4ITEYELogin.login("http://www.iteye.com/login", "your name", "your password"); //关闭httpClient String indexHtml = httpClient4ITEYELogin.getITEyePageContent("http://www.iteye.com/"); //看看有没有欢迎xxx登录 System.out.println(indexHtml); httpClient4ITEYELogin.httpClient.close(); } }
关键点:首次访问先把authenticity_token取到,这个为input type="hiden"可以通过jsoup取到这个值,这个值会变化,每次关闭浏览器,再重新访问,这个值就会变,没运行一次HttpClient4ITEYELogin这个值也会变