预备知识请查看使用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; } }