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"));这一步,就不在进行了,请各位高手帮个忙,看有没有办法让我在程序里获取用户输入的密码不正确的事件,然后再提醒用户再次
输入!!!!!
...全文
589 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
  • 打赏
  • 举报
回复
我先顶一个,要顶起来,不要沉下去啊,各位大侠,帮忙啊
源码链接: https://pan.quark.cn/s/8ddf8a1c92f9 **libcurl用于获取大型文件**libcurl作为一个开源的C语言库,提供了一系列的API来处理与URL相关的任务,涵盖了HTTP、FTP、SMTP等多种网络协议的应用。在执行大型文件的下载操作时,libcurl展现出卓越的性能表现和高度的灵活性,能够高效地管理大文件传输过程,有效预防内存溢出及其他潜在问题。**libcurl的基础操作**libcurl的基础应用包括以下几个环节:1. **初始化**:需要借助`curl_global_init()`函数来启动libcurl的工作环境。2. **建立会话句柄**:通过`curl_easy_init()`函数创建一个会话句柄,该句柄将用于后续所有的操作流程。3. **配置选项**:运用`curl_easy_setopt()`函数来设定多种参数,例如目标URL、超时时间、重试次数以及数据写入的回调函数等。4. **执行请求**:调用`curl_easy_perform()`函数来实施下载操作。5. **释放资源**:使用`curl_easy_cleanup()`函数来释放已经占用的资源。**获取大型文件时的重要设置**1. **数据写入回调函数**:在处理大型文件下载时,通常不希望一次性将整个文件载入内存。可以配置`CURLOPT_WRITEFUNCTION`选项,指定一个回调函数来处理接收到的数据片段,这样libcurl在接收到数据时会调用该函数,使得我们可以按需将数据写入文件或缓冲区。2. **缓冲策略**:可以设定缓冲区的大小(比如,通过`CURLOPT_BUFFERSIZE`),来控制每次接收数据的数量,从而优化内存...
内容概要:本文档整合了《鬼谷子·决篇》与《三略·审权变第三》《差德行第四》三大古代智慧典籍,构建了一套“决策+形势+用人”三位一体的领导力提升体系。通过28天三合实战路径、三维诊断工具、9个实用模板及独特的“身体锚点”仪式,系统解决管理者在决策犹豫、形势误判、人岗错配等方面的痛点。全文涵盖理论溯源、方法论拆解(如三步决策法、审权变四步法、差德行四步法)、历史案例对照(范蠡 vs 项羽)以及跨资源联动建议,形成从认知到实践的完整闭环。; 适合人群:中基层管理者、创业者、职场进阶者,尤其是面临决策困境、环境适应困难或团队用人问题的人群;具备一定管理经验或自我提升意识的个体亦可受益。; 使用场景及目标:① 提升重大事项的决策质量,避免反复纠结与事后后悔;② 增强对外部环境变化的敏感度与应对能力,实现灵活调整;③ 科学评估人才德才素质,实现人岗精准匹配,减少用人失误;④ 构建个人化的决策-应变-用人标准化流程(SOP)。; 阅读建议:建议按照28天路径逐步实践,结合自测表定位短板,优先突破薄弱模块;配套工具模板需实际填写使用,配合身体锚点仪式强化行为记忆;可与“诸葛亮决策术”“立将威信术”等单品联动,全面提升领导力体系。

81,111

社区成员

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

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