使用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 使用来自其他服务的身份验证来授权路由请求