• 使用httpClient模拟登陆开心网过程中登陆成功但是跳转不成功


    package com.haojiahong.test;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import org.apache.http.HttpResponse;
    import org.apache.http.NameValuePair;
    import org.apache.http.client.ResponseHandler;
    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.impl.client.BasicResponseHandler;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.message.BasicNameValuePair;
    import org.apache.http.protocol.HTTP;
    
    public class KaixinLoginTest {
    
    	// The HttpClient is used in one session
    	private static HttpResponse response;
    	private static DefaultHttpClient httpclient = new DefaultHttpClient();
    
    	public static void main(String[] args) throws Exception {
    		KaixinLoginTest kaixin = new KaixinLoginTest();
    		kaixin.printText();
    	}
    
    	// 原因就是在这里,一开始使用post提交url,可是这个url这是一个类似jsp的地址,给它参数后他并不走后台业务逻辑判断,
    	// 因此也就不会返回给你正确的跳转地址,即使你测试得到了正确的statusCode
    	// 所以一定要是用请求后台acting的地址,actionUrl,这个可以去对应的网页源码中查到。
    	private static String url = "http://www.kaixin001.com/login/login.php";
    
    	private static String actionUrl = "https://security.kaixin001.com/login/login_post.php";
    
    	private boolean login() {
    		HttpPost httpost = new HttpPost(actionUrl);
    
    		BasicNameValuePair username = new BasicNameValuePair("email",
    				"**********你的账号*******");
    		BasicNameValuePair password = new BasicNameValuePair("password",
    				"**********你的密码*******");
    		List<NameValuePair> nvps = new ArrayList<NameValuePair>();
    
    		nvps.add(username);
    		nvps.add(password);
    
    		try {
    			httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
    			response = httpclient.execute(httpost);
    			//302表示临时跳转地址。
    			System.out.println(response.getStatusLine().getStatusCode()
    					+ "++++++++++++++++++++++++++++++++++++++++++++");
    
    		} catch (Exception e) {
    			e.printStackTrace();
    			return false;
    		} finally {
    			httpost.abort();
    		}
    		return true;
    	}
    
    	private String getRedirectLocation() {
    		//跳转成功后,这里会收到一个完整的url地址,而不是类似于"/home/"这样的地址。
    		String location = response.getFirstHeader("Location").getValue();
    
    		if (location == null) {
    			return null;
    		}
    		return location;
    	}
    
    	private String getText(String redirectLocation) {
    		HttpGet httpget = new HttpGet(redirectLocation);
    
    		ResponseHandler<String> responseHandler = new BasicResponseHandler();
    		String responseBody = "";
    		try {
    			//打印出来跳转成功后的页面源码。
    			responseBody = httpclient.execute(httpget, responseHandler);
    		} catch (Exception e) {
    			e.printStackTrace();
    			responseBody = null;
    		} finally {
    			httpget.abort();
    			httpclient.getConnectionManager().shutdown();
    		}
    		return responseBody;
    	}
    
    	public void printText() {
    		if (login()) {
    			String redirectLocation = getRedirectLocation();
    			if (redirectLocation != null) {
    				System.out.println(getText(redirectLocation));
    			}
    		}
    	}
    }
    //有些网站会对参数进行加密,action请求地址也写的不明确,比如博客园网站,还没有学会改怎么去模拟登陆,欢迎大神指教。
  • 相关阅读:
    git客户端
    Autowired注解的妙用---在Controller里的构造函数里获取需要注入的对象
    面向对象的理解
    改变对update的做法
    时间戳与日期相互转换
    Git随记
    json数据传输有感
    Mybatis的批量CRUD
    并发与线程有感
    dpkg --info
  • 原文地址:https://www.cnblogs.com/haojiahong/p/4661862.html
Copyright © 2020-2023  润新知