服务器返回 HTTP 响应代码:401 用于 URL:https

Posted

技术标签:

【中文标题】服务器返回 HTTP 响应代码:401 用于 URL:https【英文标题】:Server returned HTTP response code: 401 for URL: https 【发布时间】:2012-05-15 19:18:41 【问题描述】:

我正在使用 Java 访问一个 HTTPS 站点,该站点以 XML 格式返回显示。我在 URL 本身中传递登录凭据。这是代码sn-p:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
requestURL = "https://Administrator:Password@localhost:8443/abcd";

try  
    InputStream is = null;
    URL url = new URL(requestURL);
    InputStream xmlInputStream =new URL(requestURL).openConnection().getInputStream();
    byte[] testByteArr = new byte[xmlInputStream.available()];
    xmlInputStream.read(testByteArr);
    System.out.println(new String(testByteArr));
    Document doc = db.parse(xmlInputStream);
    System.out.println("DOC="+doc);
 catch (MalformedURLException e) 
 

我正在程序中创建一个不验证签名/未签名证书的信任管理器。但是,在运行上述程序时,我得到了错误 服务器返回 HTTP 响应代码:401 对应 URL:https://Administrator:Password@localhost:8443/abcd

我可以在我的浏览器上使用相同的 url,它可以正确显示 xml。请让我知道如何在 Java 程序中完成这项工作。

【问题讨论】:

【参考方案1】:

401 的意思是“未经授权”,因此您的凭据一定有一些东西。

我认为 java URL 不支持您显示的语法。您可以改用 Authenticator。

Authenticator.setDefault(new Authenticator() 

    @Override
    protected PasswordAuthentication getPasswordAuthentication()           
        return new PasswordAuthentication(login, password.toCharArray());
    
);

然后简单地调用常规 url,没有凭据。

另一种选择是在标头中提供凭据:

String loginPassword = login+ ":" + password;
String encoded = new sun.misc.BASE64Encoder().encode (loginPassword.getBytes());
URLConnection conn = url.openConnection();
conn.setRequestProperty ("Authorization", "Basic " + encoded);

PS:不建议使用 Base64Encoder,但这只是为了展示一个快速的解决方案。如果您想保留该解决方案,请寻找一个库。有很多。

【讨论】:

感谢纪尧姆·波莱特。第二个选项就像一个魅力。我只需要它进行内部测试,所以我认为这可能就足够了。【参考方案2】:

试试这个。您需要通过身份验证才能让服务器知道它是一个有效用户。您需要导入这两个包,并且必须包含一个 jersy jar。如果你不想包含 jersy jar 然后导入这个包

import sun.misc.BASE64Encoder;

import com.sun.jersey.core.util.Base64;
import sun.net.www.protocol.http.HttpURLConnection;

然后,

String encodedAuthorizedUser = getAuthantication("username", "password");
URL url = new URL("Your Valid Jira URL");
HttpURLConnection httpCon = (HttpURLConnection) url.openConnection();
httpCon.setRequestProperty ("Authorization", "Basic " + encodedAuthorizedUser );

 public String getAuthantication(String username, String password) 
   String auth = new String(Base64.encode(username + ":" + password));
   return auth;
 

【讨论】:

以上是关于服务器返回 HTTP 响应代码:401 用于 URL:https的主要内容,如果未能解决你的问题,请参考以下文章

使用基于表单的身份验证时,http 服务器应在 401 响应中返回啥 WWW-Authenticate 标头?

HTTP响应码403 Forbidden和401 Unauthorized对比

当 HTTP 请求返回状态 401 时,如何在 Java 中解析响应正文

Angular 2 - 预检响应具有无效的 HTTP 状态代码 401

http协议的状态码——400,401,403,404,500,502,503,301,302等常见网页错误代码

http协议的状态码——400,401,403,404,500,502,503,301,302等常见网页错误代码