HttpURLConnection写的模拟登陆

前几天由于一个项目的需求要获取教务系统的课表,获取课表由于没有API所以只能自己瞎折腾,最初的版本破解了我自己做的一个简单的登陆网站并获取到了后台的数据,源码是这样的:

package test;

import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class bbslogin {
	public static void main(String[] args) throws IOException {
		
String surl = "http://localhost:8080/BBS5/login.jsp";
URL url = new URL(surl);
//创建url对象能与HttpURLConnection对话
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
//打开输入输出流,方便传入数据与传出数据
connection.setDoInput(true);
connection.setDoOutput(true);
//实际链接操作是connection.connect   这一句话就隐式调用了connection.connect
OutputStreamWriter out = new OutputStreamWriter(connection
	.getOutputStream(), "GBK");
//传入数据
out.write("uname=aa&upass=a"); 
out.flush();
//注意记得关闭流,不然连接不能结束会抛出异常
out.close();
//获取服务器发送给你的Set-Cookie,连接网站就靠他了
String cookieVal = connection.getHeaderField("Set-Cookie");
//得到后,下面的操作就是你想得到哪个页面的数据了
String s = "http://localhost:8080/BBS5/doIndex.jsp";  
            url = new URL(s);  
HttpURLConnection resumeConnection = (HttpURLConnection) url  
      .openConnection();  
//传入你上面获取到的Set-Cookie
if (cookieVal != null) {  
  resumeConnection.setRequestProperty("Cookie", cookieVal);  
}  
//实际链接,我曾经也想,为什么不带账号密码和cookie一起传而只创cookie呢,实际上浏览器识别一个客户都是用cookie来识别,cookie中就包含了这些信息
resumeConnection.connect();  
//创建输入流对象,接收连接后的网页数据
InputStream urlStream = resumeConnection.getInputStream();  
//将输入流以bufferedReader的方式输出
BufferedReader bufferedReader = new BufferedReader(  
      new InputStreamReader(urlStream));  
String ss = null;  
String total = "";  
//输出结果。校验你是否操作成功
while ((ss = bufferedReader.readLine()) != null) {  
  total += ss;  
  System.out.println(ss);
}  


}
}
代码亲测可用   

然后,我踏上了征服教务系统的旅程,这个时候,你对浏览器和服务器之间进行的操作将会越来越清楚,遇到的小问题也会越来越多,你不是太熟悉,而且不能打断点,你只能看到没有登陆成功的网页显示出来,所以你也不知道链接不成功到底是哪一方面的原因,你只能去全面了解浏览器和服务器之间的操作。起初我认为是没有设置请求头,参数不全所致,然后,便陷入了作死模式,无现的寻找那些未知的参数如何来的。后来我用ie10抓包,发现教务系统的setcookie并不是从登陆页面的正面传过来的,这个是关键,在这里亲身经历告诉大家思考不能太死板,要先看你想获得的那些数据的网页的cookie从哪里来,然后一直找到源头,用火狐和ie都可以查看。  好,你们觉得我进去了吗?很遗憾,我还是没有进去,为了能交上作业,我用了高级工具httpclient,用上我找的网页拼上账号密码,一秒钟进去,自尊很是打击,本来想告一段落,可是有一个勤奋好学的朋友冯景华一直想问底层,不想用高级工具,在迫于他的淫威,和我的自尊心下,我又奋斗了一天,终于找到了问题的关键connection.setInstanceFollowRedirects(false); 我没有关闭这个!!!导致重定向时,我的cookie给清了,而httpclient对cookie管理的工作处理的特别好,一切设置也不需要你来弄,只需要传参.呵呵,问题终于解决了,源码就不传了毕竟是学校的系统,在这个基础上,设置请求头,加上connection.setInstanceFollowRedirects(false);就行了

,还有提醒注意一下connection.addRequestProperty和addRequestProperty,如果有同名参数set会覆盖connection里面接收到的RequestProperty

每个网站登陆的保密性能都不一样,不是登陆过一个学校的教务系统就能登陆所有的教务系统,所以请放开心,我们学校的比较简单,还有一种加验证码的,有空在尝试一下。

以下是一个使用Java模拟登陆的示例代码: ```java import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.util.List; import java.util.Map; public class LoginDemo { public static void main(String[] args) throws Exception { String loginUrl = "http://example.com/login"; String username = "your_username"; String password = "your_password"; // Create a new URL object URL url = new URL(loginUrl); // Create a new HttpURLConnection object HttpURLConnection connection = (HttpURLConnection) url.openConnection(); // Set the request method to POST connection.setRequestMethod("POST"); // Set the request headers connection.setRequestProperty("User-Agent", "Mozilla/5.0"); connection.setRequestProperty("Accept-Language", "en-US,en;q=0.5"); // Set the request parameters String params = "username=" + URLEncoder.encode(username, "UTF-8") + "&password=" + URLEncoder.encode(password, "UTF-8"); connection.setDoOutput(true); connection.getOutputStream().write(params.getBytes("UTF-8")); // Send the request int responseCode = connection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { // Read the response BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); // Print the response System.out.println(response.toString()); // Get the cookies from the response headers Map<String, List<String>> headerFields = connection.getHeaderFields(); List<String> cookiesHeader = headerFields.get("Set-Cookie"); if (cookiesHeader != null) { // Parse the cookies and store them in a CookieManager object java.net.CookieManager cookieManager = new java.net.CookieManager(); for (String cookie : cookiesHeader) { cookieManager.getCookieStore().add(null, HttpCookie.parse(cookie).get(0)); } // Use the CookieManager to send subsequent requests with the cookies URL newUrl = new URL("http://example.com/protected_page"); HttpURLConnection newConnection = (HttpURLConnection) newUrl.openConnection(); cookieManager.getCookieStore().getCookies().forEach(c -> newConnection.addRequestProperty("Cookie", c.toString())); int newResponseCode = newConnection.getResponseCode(); if (newResponseCode == HttpURLConnection.HTTP_OK) { // Read the response BufferedReader newIn = new BufferedReader(new InputStreamReader(newConnection.getInputStream())); String newInputLine; StringBuffer newResponse = new StringBuffer(); while ((newInputLine = newIn.readLine()) != null) { newResponse.append(newInputLine); } newIn.close(); // Print the response System.out.println(newResponse.toString()); } else { System.out.println("Failed to fetch protected page"); } } } else { System.out.println("Failed to login"); } } } ``` 此代码将使用POST请求发送用户名和密码到登录页面。如果登录成功,它将获取响应标头中的cookie,并将其存储在CookieManager对象中。然后,它将使用CookieManager对象向受保护的页面发送新请求,并在请求中添加所有cookie。如果此请求成功,它将打印受保护页面的内容。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值