刚来公司上班,发现需要自己每天都登录内部网进行签到,然后因为我健忘和怕麻烦,所以就有了它。
首先,我向你们推荐一款抓包软件,Fiddler Web Debugger,可以用来抓取浏览器与服务器之间传输的数据,方便模拟。看图,点击软件左边的链接可以看到与其相关的数据。
有了这些数据,我们就可以原样不动的发给服务器,达到了模拟的效果。
其中主要是一些网站的身份验证机制,我在这一方面还是一天经验的小白而已,有那句说那句。
在身份验证里面,有很多网站都是会将SessionId的值传到本地用Cookie保存起来的,而登录后,网站大多只通过Session来判断用户的有效性。
所以现在我们要做的就是,登录,从返回的Cookie信息中获取有效的SessionId值,然后在随后的访问中,携带上这个SessionId的值就可以一路绿灯了。
另外,就aspx的网页验证,其一般会在表单中添加__VIEWSTATE,__EVENTVALIDATION等字段值作为验证用户正常操作的一个条件。当然,这在Fiddler Web Debugger的眼皮底下是一目了然的。
原理很简单,下面给出关键的网络访问代码。
项目包下载地址:https://yunpan.cn/cBsDXLbaICHIC 访问密码 5a02
//sUrl是访问链接,param是post提交的参数。
public String mySendPost(String sUrl,String param)
{
PrintWriter out = null;
BufferedReader in = null;
String result = "";
try {
URL url = new URL(sUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();//编写请求头
//将sessionId的值写入Cookie,ASPXAUTH为空,这里可以不要(按照具体的验证机制来写)
conn.setRequestProperty("Cookie", sessionId+ASPXAUTH);
conn.setRequestProperty("Host", "http://192.168.0.200");
conn.setRequestProperty("accept",
"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.63 Safari/537.36");
conn.setRequestProperty("Upgrade-Insecure-Requests", "1");
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("Accept-Encoding", "gzip, deflate");
conn.setRequestProperty("Accept-Language", "zh-CN,zh;q=0.8");
conn.setRequestProperty("Referer", lastUrl);//上一页面的链接(一些系统会对此进行判断)
lastUrl = sUrl;//赋值该当前访问链接为上一页面的链接
conn.setRequestMethod("POST");// 提交模式
// 发送POST请求必须设置如下两行
conn.setDoOutput(true);
conn.setDoInput(true);
//获取输出流
out = new PrintWriter(conn.getOutputStream());
// 发送请求参数
out.print(param);
// flush输出流的缓冲
out.flush();
// 定义BufferedReader输入流来读取URL的响应
in = new BufferedReader(
new InputStreamReader(conn.getInputStream(),"UTF-8"));
//读取返回结果
String line;
while ((line = in.readLine()) != null) {
result += line;
}
Map> map = conn.getHeaderFields();
//printCookie(map);//输出浏览器发给我们的所有请求头
getSessionId(map);//从请求头中获取SessionId
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (ProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
finally{
try{
if(out!=null){
out.close();
}
if(in!=null){
in.close();
}
}
catch(IOException ex){
ex.printStackTrace();
}
}
//System.out.println("获取结果:"+result);
return result;
}
private void printCookie(Map> map)
{
System.out.println("输出Cookie:");
for(String key :map.keySet())
{
System.out.println("key= "+ key + " and value= " + map.get(key));
}
}
private void getSessionId(Map> map)
{
List sResult = map.get("Set-Cookie");//从请求头中获取Cookie信息
if(sResult!=null&&sResult.size()>1)//从Cookie中获取SessionId
{
sessionId = sResult.get(1);
sessionId = sessionId.substring(0, sessionId.indexOf(";")+1);
System.out.println("获取sessionId:"+sessionId);
}
}