HttpURLConnection Authenticator 密码错误 紧急求助

y815007145 2011-03-08 03:50:52
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.Authenticator;
import java.net.InetAddress;
import java.net.PasswordAuthentication;
import java.net.URL;


/**
* TODO javadoc for http.AuthenticatorTest
*
* @author wanghan
*/
public class AuthenticatorTest {
public static void main(String[] argv) throws Exception {
Authenticator.setDefault(new MyAuthenticator("user","passwd"));
URL url = new URL("http://192.168.200.10:8002");

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(),"UTF-8"));//这里根据服务器编码设置
String str;
while ((str = in.readLine()) != null) {
System.out.println(str);
}
in.close();
}


}
class MyAuthenticator extends Authenticator {
private String name;
private String passwd;
public MyAuthenticator(String name,String passwd){
this.name = name;
this.passwd = passwd;
}

protected PasswordAuthentication getPasswordAuthentication() {
String promptString = getRequestingPrompt();
System.out.println(promptString);
String hostname = getRequestingHost();
System.out.println(hostname);
InetAddress ipaddr = getRequestingSite();
System.out.println(ipaddr);
//int port = getRequestingPort();

String username = name;
String password = passwd;
return new PasswordAuthentication(username, password.toCharArray());
}
}

这是我在网上找出来的关于用HttpURLConnection 获取源码的例子,假如我们用HttpURLConnection 去获取路由器配置网页
的源码的话,因为一般的用电脑去登陆路由器的话,都是需要身份验证的,当然HttpURLConnection 去获取路由器配置网页
也是肯定需要身份验证的,这就是 Authenticator 的作用了,但是我有一个很基本的问题,那就是假如这个密码是要用户
临时输入的话,而且它输入的不正确,这是我们传给
Authenticator.setDefault(new MyAuthenticator("user","passwd"));的参数就是不匹配路由器的数据了,那肯定获取不了数据,还应该会报错的才对,我进行了连接路由器实验,代码卡在
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(),"UTF-8"));这一步,就不在进行了,请各位高手帮个忙,看有没有办法让我在程序里获取用户输入的密码不正确的事件,然后再提醒用户再次
输入!!!!!
...全文
530 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
y815007145 2011-03-09
  • 打赏
  • 举报
回复
楼上正解啊,不过这种方法似乎有点偏道啊,不过先这样用用吧,继续顶啊,看有没有更好的方法来获取错误信息啊
shagan 2011-03-08
  • 打赏
  • 举报
回复
http://192.168.200.10:8002用IE访问时,是不是跳出让你输入用户名及密码的框?
可以用http://用户名:密码@192.168.200.10:8002
当然,你也可以先用http://192.168.200.10:8002访问,如果Authenticator error,那么再把字符串拼出来。
另外,请在IE先试一下http://用户名:密码@192.168.200.10:8002可以访问否
paodan 2011-03-08
  • 打赏
  • 举报
回复

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Authenticator;
import java.net.InetAddress;
import java.net.PasswordAuthentication;
import java.net.URL;

public class AuthenticatorTest {

public static void main(String[] argv) throws Exception {
MyAuthenticator authenticator = new MyAuthenticator("username", "password");
Authenticator.setDefault(authenticator);
URL url = new URL("http://192.168.129.1:8002");

try {
InputStream in1 = url.openStream();
BufferedReader in = new BufferedReader(new InputStreamReader(in1, "UTF-8"));
String str;
while ((str = in.readLine()) != null) {
System.out.println(str);
}
in.close();
} catch (IOException e) {
if(authenticator.isAuthentError()){
System.out.println("用户名和密码错误,重新登录");
}else{
e.printStackTrace();
}

//System.err.println("aaaa");

}
}

}

class MyAuthenticator extends Authenticator {

private String name;

private String passwd;

private boolean authentError; //检查是否认证失败

public MyAuthenticator(String name, String passwd) {
this.name = name;
this.passwd = passwd;
}

protected PasswordAuthentication getPasswordAuthentication() {
String promptString = getRequestingPrompt();
String hostname = getRequestingHost();
InetAddress ipaddr = getRequestingSite();
if(promptString != null && hostname != null && ipaddr !=null){
authentError = true;
}
else{
authentError = false;
}

String username = name;
String password = passwd;
return new PasswordAuthentication(username, password.toCharArray());
}

public void setAuthentError(boolean authentError) {
this.authentError = authentError;
}

public boolean isAuthentError() {
return authentError;
}
}

dracularking 2011-03-08
  • 打赏
  • 举报
回复
是自己的网页吗? 就可以知道正常登录网页时是怎么发送带用户名密码信息的消息的,get or post,当时的整个http消息是怎么组织的,这些如果是自己的网页都可以知道
y815007145 2011-03-08
  • 打赏
  • 举报
回复
因为已经知道路由器是需要进行身份验证的,所以肯定是要事先输入用户名和密码的,因此我很需要能够获得这样的通知,就是用户输入的用户名和密码有误的通知。有没有办法????
y815007145 2011-03-08
  • 打赏
  • 举报
回复
没有错,这是可以获取一些内容,但是因为访问路由器是需要身份验证的。
我试着没有输入密码和用户名的情况获取 openstream
Log.e(tag + " getPageResource",
"the responsecode is " + conn.getResponseCode());
Log.e(tag + "", "the responemsg is " + conn.getResponseMessage());
这样的输出是 401 和 the responemsg is Unauthorized
dracularking 2011-03-08
  • 打赏
  • 举报
回复
我说错了,直接openstream可以的 不过针对需要登录的页面,我觉得没有用户名密码应该也能获取到一定信息
dracularking 2011-03-08
  • 打赏
  • 举报
回复
哪里有HttpURLConnection ?

先不管账户密码的问题,首先没有connection URL对象就开始获取stream了?
参考下这个:


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

public class URLTest {

public static void main(String[] args) {
URL url;
URLConnection urlconn;
try {
url = new URL("http://www.google.com.hk");
urlconn = url.openConnection();
HttpURLConnection httpConnection = (HttpURLConnection) urlconn;
InputStream in = httpConnection.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in, "Big5"));

String line = "";
while((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
in.close();
} catch(IOException e) {
e.printStackTrace();
}
}
}
y815007145 2011-03-08
  • 打赏
  • 举报
回复
没有进展是指那一句后面的代码没有再运行了,完全被忽视了,而且也没有抛出错误
y815007145 2011-03-08
  • 打赏
  • 举报
回复
url.openStream(),我想是因为密码错误,所以导致了程序挂在这句代码上,我想是否有什么办法来获取这个错误啊
y815007145 2011-03-08
  • 打赏
  • 举报
回复
没有报错,只是就停在那句BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(),"UTF-8"));
然后就没有进展了
strike2368168 2011-03-08
  • 打赏
  • 举报
回复
不再进行了是什么概念?
报错吗?什么错误贴出来
如果把这行删除不转换编码的话会怎样试试
y815007145 2011-03-08
  • 打赏
  • 举报
回复
我先顶一个,要顶起来,不要沉下去啊,各位大侠,帮忙啊

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧