使用JAVA请求需要Basic身份验证的网页

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用JAVA请求需要Basic身份验证的网页相关的知识,希望对你有一定的参考价值。

参考技术A

  通过JAVA抓取页面时 有些页面会返回 (Unauthorized)响应状态码和 authenticate响应头来要求客户端进行身份认证 这种认证有两种方式 BASIC和DIGEST BASIC验证要求客户端对用户名和密码进行BASE 编码后传送给服务器 DIGEST的认证方式的细节比较复杂 会经过一系列的加密 所以很难被破译

  JAVA提供一个用于启用身份认证的类 可以支持HTTP协议中的多个认证方式 这个类是 Authenticator 使用方法如下

  Java 代码

   package xixuyishi;

  

   import java io BufferedReader;

   import java io InputStream;

   import java io InputStreamReader;

   import Authenticator;

   import PasswordAuthentication;

   import URL;

  

   public class RunHttpSpnego

  

       static final String kuser = username ; // 用户名

       static final String kpass = password ; // 密码

       static class MyAuthenticator extends Authenticator

  

           @Override

           public PasswordAuthentication getPasswordAuthentication()

               return (new PasswordAuthentication(kuser kpass toCharArray()));

          

      

  

       public static void main(String[] args) throws Exception

           Authenticator setDefault(new MyAuthenticator());

           URL url = new URL(args[ ]);

           InputStream ins = url openConnection() getInputStream();

           BufferedReader reader = new BufferedReader(new InputStreamReader(ins));

           String str;

           while ((str = reader readLine()) != null)

               System out println(str);

      

  

lishixinzhi/Article/program/Java/hx/201311/26467

向需要 Windows 身份验证的网页发出 Web 请求

【中文标题】向需要 Windows 身份验证的网页发出 Web 请求【英文标题】:Making a web request to a web page which requires windows authentication 【发布时间】:2011-04-03 13:00:01 【问题描述】:

我正在尝试使用 .net 中的 WebRequest 类向网页发出请求。我试图读取的 url 需要 Windows 身份验证,因此我得到了未经授权的异常。如何将 Windows 凭据传递给此请求,以便它可以进行身份​​验证。

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create( "http://myapp/home.aspx" );

request.Method = "GET";
request.UseDefaultCredentials = false;
request.PreAuthenticate = true;
request.Credentials = new NetworkCredential( "username", "password", "domain" );

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); // Raises Unauthorized Exception

this.Response.Write( response.StatusCode );

以上代码返回如下错误。

System.Net.WebException: The remote server returned an error: (401) Unauthorized.

我在检查异常详细信息时注意到一件事,即我尝试访问的 url 正在重定向到另一个 url,这提示我提供 NT 登录详细信息。我相信凭据也应该转发到这个 url。但显然它没有发生。

【问题讨论】:

这可能会有所帮助:msdn.microsoft.com/en-us/library/ff647405.aspx 谢谢,将 PreAuthenticate 设置为 true 有助于解决我的问题。 【参考方案1】:

您应该使用Credentials 属性将 Windows 凭据传递给 Web 服务。

如果您希望将当前 Windows 用户的凭据传递给服务,那么

request.Credentials = CredentialCache.DefaultCredentials;

应该可以解决问题。否则使用NetworkCredential,如下:

request.Credentials = new NetworkCredential(user, pwd, domain);

【讨论】:

正如您在我发布的代码中看到的那样,我正在使用 NetworkCredential 类来传递我的 Windows 登录信息。但即使这样也行不通。 你后来放了代码吗?我不记得见过。无论如何,401 错误意味着凭据可能是错误的,或者也可能意味着凭据正确但该用户无权访问该 URL。我建议您从浏览器检查您的服务网址。如果它从那里工作,那么它应该与 WebRequest 一起工作。 我编辑了帖子并包含了代码。此外,我可以使用凭据访问浏览器中的 url,但无法使用 WebRequest 执行相同操作。 试试 request.PreAuthenticate = false;推理是服务器抛出 401 作为质询响应,除非此属性为 false,否则 WebRequest 不会响应质询。 运气不好!最后一个建议 - 使用诸如 Fiddler (www.fiddler2.com) 之类的工具,并将来自浏览器(到服务)的请求-响应链与来自 WebRequest 的请求-响应链进行比较。正如您所说,服务可以通过浏览器工作,通过比较请求-响应,您应该知道问题出在哪里。【参考方案2】:

要对 WebService 进行身份验证,请使用 DefaultNetworkCredentials 而不是 DefaultCredentials:

request.Credentials = CredentialCache.DefaultNetworkCredentials;

【讨论】:

这解决了一个我试图解决一周的问题。谢谢! 我想知道它是否有助于解决我当前的问题:***.com/questions/67335532/…?我读到了关于它们之间差异的相互矛盾的东西。我会尽快尝试的。【参考方案3】:

我正在尝试通过 Windows 凭据访问链接 A。然后链接 A 会自动将我重定向到链接 B,但不会传递我提供的 Windows 凭据。因此错误。我做了request.AutoRedirect = false,每次我在标题中获得位置时都会循环,即每次传递Windows凭据时我都会手动进行重定向。

这对我有用:)

【讨论】:

【参考方案4】:

使用 VS2015,request.UseDefaultCredentials = true; 适合我!

【讨论】:

以上是关于使用JAVA请求需要Basic身份验证的网页的主要内容,如果未能解决你的问题,请参考以下文章

Kong Basic Auth 使用来自其他服务的身份验证来授权路由请求

使用BASIC身份验证创建会话

Ruby:摘要代理身份验证

Chrome的HTTP BASIC身份验证注销问题

在 Angular 2 中使用基本身份验证预检 CORS 请求

HTTP 请求未经客户端身份验证方案“基本”授权。从服务器收到的身份验证标头为“基本领域 =”