很多情況下,公司的電腦是加入域的,而且上外網是要通過代理上網的,這總情況下使用httpclient訪問外網時必須使用代理,並且要通過NTLM驗證,所以需要在httpclient中使用NTLM協議。
關於NTLM,可以參考這裏。 以下給出解決此問題的代碼。
有些時候採集需求會是公司內部人員提出,採集內網bbs
內網權限認證有時會基於NTLM
所以每次請求的時候需要請求頭部帶上認證信息
public static String getWithNTCredential(String url,boolean needProxy,int msTimeOut){
log.info("--get url:[" + url + "]");
String responseBody = null;
HttpMethod getMethod = new GetMethod(url);
if(msTimeOut>0) {
getMethod.getParams().setSoTimeout(msTimeOut);
}
log.info("--queryString:" + getMethod.getQueryString());
HttpClient httpClient = new HttpClient();
if (needProxy) {
String proxyUrl = "10.xx.xx.xx";//代理機IP
String proxyPort ="8080";//代理機端口
String proxyUser ="xxxx";//代理用戶名
String proxyPassword ="xxxx";//代理用戶密碼
String domain="xxxx.COM";//計算機所在的域
httpClient.getHostConfiguration().setProxy(proxyUrl,Integer.parseInt(proxyPort));
List authPrefs = new ArrayList(2);
authPrefs.add(AuthPolicy.NTLM);
httpClient.getParams().setParameter(HttpMethodParams.USER_AGENT,"Mozilla/5.0 (Windows NT 5.1; rv:14.0) Gecko/20100101 Firefox/14.0.1");
httpClient.getParams().setParameter(AuthPolicy.AUTH_SCHEME_PRIORITY, authPrefs);
// 如果代理需要密碼驗證,這裏設置用戶名密碼
NTCredentials ntc=new NTCredentials(proxyUser, proxyPassword,proxyUrl,domain);
httpClient.getState().setProxyCredentials(AuthScope.ANY,ntc);
}
try {
int statusCode = httpClient.executeMethod(getMethod);
log.info("http get url:" + getMethod.getURI());
log.info("----http status code:" + statusCode);
if (statusCode == HttpStatus.SC_OK || statusCode==HttpStatus.SC_PARTIAL_CONTENT) {
responseBody = getMethod.getResponseBodyAsString();
}
} catch (HttpException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
getMethod.releaseConnection();
}
return responseBody;
}
參考資料:
http://www.cnblogs.com/nbpowerboy/archive/2013/05/19/3086579.html