欢迎光临
我们一直在努力

程序员HttpURLConnection使用登录的用户,而不是使用提供的凭据来连接Web服务 – java

程序员面试经验

我创建了一个Java应用程序来连接IIS 7(Windows Server 2008 R2)中托管的ASP.Net Asmx Web服务。托管站点被配置为Windows身份验证的身份验证类型,并且提供程序的身份协商和ntlm

在Java代码中,我使用Authenticator Class设置用户名和密码。如果我输入的密码错误,此代码将连接到Web服务事件。我检查了IIS日志,它实际上使用了当前登录的用户来连接Web服务。

我在调用getPasswordAuthentication()函数后尝试调试Java代码。java代码使用krb5身份验证方法验证了用户名和密码。在这一点上,这引发了异常

  “无法找到Kerberos领域”

但是此异常是在Java api上处理的,并且我正在从Web服务获取响应

如果提供的凭证错误,我们的要求是使用提供的凭证连接Web服务。它应该返回未经授权的访问代码。

下面是我的Java代码。

import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.Authenticator; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection;  import org.apache.commons.codec.binary.Base64;  public class ConnectToUrlUsingBasicAuthentication {      public static void main(String[] args) {          try {             String webPage = "http://servername/webservice/ABC.asmx/GetStudentReport";             String name = "domain.lab\sachin";             String password = "Password123";              //NtlmHandler handler = new NtlmHandler();              Authenticator.setDefault(new NtlmAuthenticator(name, password));              String authString = name + ":" + password;             System.out.println("auth string: " + authString);             byte[] authEncBytes = Base64.encodeBase64(authString.getBytes());             String authStringEnc = new String(authEncBytes);             System.out.println("Base64 encoded auth string: " + authStringEnc);              URL url = new URL(webPage);             HttpURLConnection conn = (HttpURLConnection) url.openConnection();             //conn.setRequestProperty("Authorization", "Basic " +authStringEnc );             conn.connect();              System.out.println("Response Code: " + conn.getResponseCode() );              URLConnection urlConnection = url.openConnection();             urlConnection.setRequestProperty("Authorization", "Basic " + authStringEnc);             InputStream is = urlConnection.getInputStream();             InputStreamReader isr = new InputStreamReader(is);              int numCharsRead;             char[] charArray = new char[1024];             StringBuffer sb = new StringBuffer();             while ((numCharsRead = isr.read(charArray)) > 0) {                 sb.append(charArray, 0, numCharsRead);             }             String result = sb.toString();              System.out.println("*** BEGIN ***");             System.out.println(result);             System.out.println("*** END ***");         } catch (MalformedURLException e) {             e.printStackTrace();         } catch (IOException e) {             e.printStackTrace();         }     }  } 

下面是NtlmAuthenticator类

import java.net.Authenticator; import java.net.PasswordAuthentication;  public class NtlmAuthenticator extends Authenticator {        private final String username;       private final char[] password;        public NtlmAuthenticator(final String username, final String password) {         super();         this.username = new String(username);         this.password = password.toCharArray();        }        @Override       public PasswordAuthentication getPasswordAuthentication() {           System.out.println("Scheme:" + getRequestingScheme() );           System.out.println("Host:" + getRequestingHost() );          PasswordAuthentication pa = new PasswordAuthentication(username, password);          System.out.println("UserName:" + pa.getUserName() );          System.out.println("Password:" + pa.getPassword().toString() );         return pa;  } } 

请提前提供建议谢谢。

参考方案

如果您在Windows上运行客户端,则此行为是指定的。身份验证过程将首先尝试使用登录的用户凭据。

这是在http://docs.oracle.com/javase/6/docs/technotes/guides/net/http-auth.html的NTLM部分下指定的:“在Microsoft Windows平台上,NTLM身份验证尝试从系统获取用户凭据而不提示用户的身份验证器对象”。

Java-搜索字符串数组中的字符串 – java

在Java中,我们是否有任何方法可以发现特定字符串是字符串数组的一部分。我可以避免出现一个循环。例如String [] array = {"AA","BB","CC" }; string x = "BB" 我想要一个if (some condition to tell wheth…

Java:找到特定字符并获取子字符串 – java

我有一个字符串4.9.14_05_29_16_21,我只需要获取4.9。数字各不相同,所以我不能简单地获得此char数组的前三个元素。我必须找到最正确的.并将其子字符串化直到那里。我来自Python,因此我将展示Python的实现方法。def foobar(some_string): location = some_string.rfind('.&…

Java RegEx中的单词边界 b – java

我在使用b作为Java Regex中的单词定界符时遇到困难。对于text = "/* sql statement */ INSERT INTO someTable"; Pattern.compile("(?i)binsertb");找不到匹配项Pattern insPtrn = Pattern.compile(&…

如何转义将成为字符串一部分的斜线? – java

我很难找到一种方法来逃避这些引用,String key = StringUtils.substringBetween(html, "class="category_keyword"", ">"); 特别是这部分:"class="category_keyword…

Java Double与BigDecimal – java

我正在查看一些使用双精度变量来存储(360-359.9998779296875)结果为0.0001220703125的代码。 double变量将其存储为-1.220703125E-4。当我使用BigDecimal时,其存储为0.0001220703125。为什么将它双重存储为-1.220703125E-4? 参考方案 我不会在这里提及精度问题,而只会提及数字…

赞(0)
未经允许不得转载: 京大飞辅助网程序员面试-区块链javago面经 » 程序员HttpURLConnection使用登录的用户,而不是使用提供的凭据来连接Web服务 – java

相关推荐

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址