服务器返回的 HTTP 响应代码:401(对于 URL:https)

2022-09-02 20:23:58

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

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响应代码:URL的401:https://Administrator:Password@localhost:8443/abcd

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


答案 1

401 表示“未经授权”,因此您的凭据必须包含某些内容。

我认为java不支持您正在显示的语法。您可以改用身份验证器。URL

Authenticator.setDefault(new Authenticator() {

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

然后只需调用常规网址,而无需凭据。

另一个选项是在标头中提供凭据:

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

PS:不建议使用Base64编码器,但这只是为了显示快速解决方案。如果要保留该解决方案,请查找具有此目的的库。有很多。


答案 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;
 }