我正在尝试创建一个应用程序,该应用程序使用用户名和密码连接到使用 NTLM 身份验证(不是我的身份验证,因此我无法更改身份验证方法)的网页,并返回页面的源代码,稍后我将使用它来提取信息我需要的。
我的问题是身份验证步骤。使用 HttpUrlConnection 返回错误 401-未经授权。我正在使用 jcifs。已经将它添加到 build.gradle 文件中
compile group: 'jcifs', name: 'jcifs', version: '1.3.17'
代码灵感来自这里:
使用 HttpURLConnection 进行 NTLM 身份验证
类声明之前的导入行
import org.apache.http.impl.auth.NTLMEngineException;
不起作用,因为我怀疑 httpclient 已被弃用
我的代码示例:
public class DataFetcher extends AsyncTask<String, Void, String>{
protected String doInBackground(String... urls){
jcifs.Config.registerSmbURLHandler();
URL url;
HttpURLConnection connection = null;
String result = "" ;
try{
url = new URL(urls[0]);
Log.i("URL Connected", "Done");
connection = (HttpURLConnection) url.openConnection();
Log.i("Connection Established","Done");
InputStream inputStream;
int status = connection.getResponseCode();
if(status != HttpURLConnection.HTTP_OK){
inputStream = connection.getErrorStream();
}else {
inputStream = connection.getInputStream();
}
Log.i("Input Stream made","Done");
InputStreamReader reader = new InputStreamReader(inputStream);
Log.i("Input Stream Reader","Done");
int data = reader.read();
while(data!=-1){
result += (char) data;
data = reader.read();
}
}catch(MalformedURLException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}
Log.i("Done",result);
Log.i("Response",""+connection.getHeaderFields());
return result;
}
}
public void fetchData(){
String url = "http://DOMAIN%5user:password@server/page.aspx";
DataFetcher fetcher = new DataFetcher();
fetcher.execute(url);
}
我检查了我发现的所有链接中的大部分(如果不是全部),但是大多数链接使用 HttpClient(已弃用)和 apache 客户端(也已弃用)