预备知识请查看使用Apache HttpClient访问JSP发送GET和POST请求
这里主要介绍对于ASP的访问的一点需要注意的地方。
1、访问ASP.NET网站时,需要请求的上下文,即必须保证HttpClient不能被关闭(也许这是必须的);
2、发送POST请求时,需要根据上一次请求时从服务器端带过来的隐藏域数据,也就是:__PREVIOUSPAGE、__EVENTVALIDATION、__VIEWSTATE,或者还有其它的,创建表单时要把他们(如果有的话)都填进去;
3、你需要使用HttpWatch查看一下IE的发送数据,找到你要点的按钮(MS根据按钮的名称判断进谁的事件,猜测的...);
Apache HttpClient 版本 4.0.3
下载地址:http://hc.apache.org/downloads.cgi
package com.zywang.http;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
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.HttpClient;
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.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
public class HttpClientForAspx {
private static Map<String, String> params = null;
private static String loginPage = "http://localhost/kaoqin";
private static String defaultPage = "http://localhost/kaoqin/Default.aspx";
private static String indexPage = "http://localhost/kaoqin/Index.aspx";
private static String userName = "zywang";
private static String password = "zywang";
//.Net隐藏域
private final static String PREVIOUSPAGE = "__PREVIOUSPAGE";
private final static String EVENTVALIDATION = "__EVENTVALIDATION";
private final static String VIEWSTATE = "__VIEWSTATE";
public static void main(String[] args)
throws ClientProtocolException, IOException {
attendance("下班操作");
}
/**
* 运行按钮功能
* @throws IOException
* @throws ClientProtocolException
*/
private static void attendance(String btnValue)
throws IOException, ClientProtocolException {
HttpClient client = new DefaultHttpClient();
//打开主页
if(!loadPage(client ,loginPage)){
System.out.println("打开主页失败!");
return;
}
//执行登录
if(loginPost(client)){
//打开主页面
if(loadPage(client,indexPage)){
//开始打开 上班操作 下班操作
if(sign(client,btnValue)){
System.out.println("操作成功!");
}else{
System.out.println("操作失败!");
}
}
}else{
System.out.println("登录失败!");
}
client.getConnectionManager().shutdown();
}
/**
* 根据按钮名称进行操作
*/
private static boolean sign(HttpClient client,String btnValue)
throws IOException,
ClientProtocolException {
// System.out.println("==>>开始操作");
HttpPost post = new HttpPost(indexPage);
List<NameValuePair> qparams = new ArrayList<NameValuePair>();
qparams.add(
new BasicNameValuePair(PREVIOUSPAGE, params.get(PREVIOUSPAGE)));
qparams.add(
new BasicNameValuePair(EVENTVALIDATION, params.get(EVENTVALIDATION)));
qparams.add(
new BasicNameValuePair(VIEWSTATE, params.get(VIEWSTATE)));
//包含目标按钮则执行操作
if(getKeyByValue(btnValue)!=null){
qparams.add(new BasicNameValuePair(getKeyByValue(btnValue), btnValue));
post.setEntity(new UrlEncodedFormEntity(qparams));
HttpResponse response = client.execute(post);
int statusCode = response.getStatusLine().getStatusCode();
System.out.println("statusCode:"+statusCode);
post.abort();
return true;
}
System.out.println("没有发现按钮:["+btnValue+"]");
post.abort();
return false;
}
/**
* 登录系统
*/
private static boolean loginPost(HttpClient client) throws IOException,
ClientProtocolException {
// System.out.println("==>>开始登录");
HttpPost post = new HttpPost(defaultPage);
List<NameValuePair> qparams = new ArrayList<NameValuePair>();
qparams.add(
new BasicNameValuePair(EVENTVALIDATION, params.get(EVENTVALIDATION)));
qparams.add(new BasicNameValuePair(VIEWSTATE, params.get(VIEWSTATE)));
qparams.add(new BasicNameValuePair("imgBtnLogin.x", "0"));
qparams.add(new BasicNameValuePair("imgBtnLogin.y", "0"));
qparams.add(new BasicNameValuePair("txtUser", userName));
qparams.add(new BasicNameValuePair("txtPassword", password));
post.setEntity(new UrlEncodedFormEntity(qparams));
HttpResponse response = client.execute(post);
int statusCode = response.getStatusLine().getStatusCode();
System.out.println("statusCode:"+statusCode);
if(statusCode == 302){
post.abort();
return true;
}
post.abort();
return false;
}
/**
* 加载页面-通过GET方式
*/
private static boolean loadPage(HttpClient client,String url)
throws IOException,
ClientProtocolException {
// System.out.println("==>>加载页面(GET):"+url);
HttpGet get = new HttpGet(url);
HttpResponse response = client.execute(get);
int statusCode = response.getStatusLine().getStatusCode();
System.out.println("statusCode:"+statusCode);
HttpEntity entity = response.getEntity();
BufferedReader reader = new BufferedReader(
new InputStreamReader(entity.getContent()));
String buffer = null;
StringBuilder sb = new StringBuilder();
while((buffer=reader.readLine())!=null){
sb.append(buffer);
}
params = getAllInputNames(sb.toString());
get.abort();
return statusCode == 200;
}
private static String getInputProperty(String input,String property) {
Matcher m = Pattern.compile(property+"[\\s]*=[\\s]*\"[^\"]*\"").matcher(input);
if(m.find()){
String v = m.group();
return v.substring(v.indexOf("\"")+1,v.length()-1);
}
return null;
}
private static Map<String, String> getAllInputNames(String body){
Map<String, String> parameters = new HashMap<String, String>();
Matcher matcher = Pattern.compile("<input[^<]*>").matcher(body);
while(matcher.find()){
String input = matcher.group();
if(input.contains("name")){
parameters.put(getInputProperty(input,"name"),
getInputProperty(input,"value"));
}
}
return parameters;
}
private static String getKeyByValue(String value){
for(String s:params.keySet()){
if(params.get(s).equals(value)){
return s;
}
}
return null;
}
}