2010-09-21 4 views
2
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.Authenticator; 
import java.net.MalformedURLException; 
import java.net.PasswordAuthentication; 
import java.net.URL; 

import sun.net.www.protocol.http.AuthCacheImpl; 
import sun.net.www.protocol.http.AuthCacheValue; 



public class RunHttpSpnego { 
    public static void main(String args[]) throws MalformedURLException, 
     IOException { 
    String urlString = "http://www.yahoo.com"; 
    String username = "XXXXXXXXX"; 
    String password = "XXXXXXXX"; 
    // This is modified after the question is being asked. Now this code works fine 
    System.setProperty("http.proxyHost","176.x.xx.xx") ; 
    System.setProperty("http.proxyPort", "8080") ; 

    Authenticator.setDefault(new MyAuthenticator(username, password)); 


    URL url = new URL(urlString); 
    InputStream content = (InputStream) url.getContent(); 
    BufferedReader in = new BufferedReader(new InputStreamReader(content)); 
    String line; 
    while ((line = in.readLine()) != null) { 
     System.out.println(line); 
    } 
    System.out.println("Done."); 
    } 

    static class MyAuthenticator extends Authenticator { 
    private String username, password; 

    public MyAuthenticator(String user, String pass) { 
     username = user; 
     password = pass; 
    } 

    protected PasswordAuthentication getPasswordAuthentication() { 
     System.out.println("Requesting Host : " + getRequestingHost()); 
     System.out.println("Requesting Port : " + getRequestingPort()); 
     System.out.println("Requesting Prompt : " + getRequestingPrompt()); 
     System.out.println("Requesting Protocol: " 
      + getRequestingProtocol()); 
     System.out.println("Requesting Scheme : " + getRequestingScheme()); 
     System.out.println("Requesting Site : " + getRequestingSite()); 
     return new PasswordAuthentication(username, password.toCharArray()); 
    } 
    } 
} 

- Que vérifie-t-on maintenant, getPasswordAuthentication n'est pas du tout appelé? Je suis sûr que mon IE est activé, mais je ne sais pas quel type d'authentification était.pourquoi getPasswordAuthentication() n'est pas appelé?

+1

Etes-vous sûr que le serveur vous demande un mot de passe? Ce type de service ne fonctionne que pour les mots de passe HTTP, pas les mots de passe dans un formulaire Web. –

+0

Vous pouvez vérifier les en-têtes et savoir quel est le type d'authentification. – NullUserException

+0

Oui, c'est le mot de passe d'entrée pour IE. Le serveur attend des mots de passe chaque fois que je visiste internet, donc je dois entrer le nom d'utilisateur et mot de passe pour se connecter à Internet dans Internet Explorer – srinannapa

Répondre

5

Le Authenticator est utilisé uniquement pour les sites utilisant basic HTTP authentication (sites où vous voyez bien connu connexion de style Javascript/mot de passe pop-up), et non pas des sites Web à l'aide form based authentication (un HTML basé <form> avec des champs de login et mot de passe dans généralement un balisage eyecandy/style) et aussi pas comme une connexion dialup-like pour votre FAI. Pour le premier, vous devez en fait passer le login en tant que chaîne de requête et pour ce dernier, vous devez en fait connecter manuellement le FAI ou créer/utiliser un proxy.

+1

Voir aussi: http://www.httpwatch.com/httpgallery/authentication/ – NullUserException

+0

pls vérifier les commentaires ci-dessous la question – srinannapa

+0

L'authentificateur ne doit pas être utilisé comme mot de passe d'entrée de votre FAI. Il doit être utilisé pour les sites Web utilisant l'authentification HTTP de base. Ce sont deux choses complètement différentes. Vous avez besoin d'un proxy ici. – BalusC

-3

Si getPasswordAuthentication() est une méthode réelle et non pas simplement une formulation de ce que vous devez faire, il ne s'agit pas du tout d'une ligne dans votre code. Je suppose que vous voulez dire de l'appeler après cette ligne:

Authenticator.setDefault(new MyAuthenticator(username, password)); 

Je le vois être déclaré mais jamais appelé.

+0

Il est appelé automatiquement si le serveur demande une authentification. – NullUserException

-2

Utilisez l'URL demandant la connexion. ce qui est essentiellement utiliser dans votre cas, vous pouvez changer url yahoo à

https://login.yahoo.com/config/login_verify2?&.src=ym 
0

Essayez plutôt

DefaultHttpClient http = new DefaultHttpClient(); 
    final String username = "xxxx"; 
    final String password = "xxxx"; 
    UsernamePasswordCredentials c = new UsernamePasswordCredentials(username,password); 
    BasicCredentialsProvider cP = new BasicCredentialsProvider(); 
    cP.setCredentials(AuthScope.ANY, c); 
    http.setCredentialsProvider(cP); 

    HttpResponse res; 
+0

Essayez plutôt thi pourquoi? – EJP

2

Sun.net.www.protocol.http.ntlm.NTLMAuthentication tente d'utiliser l'authentification transparente, de les informations d'identification de l'utilisateur actuel pour se connecter au serveur distant. Dans mon scénario serveur vers serveur (serveur Java EE vers Sharepoint), cela n'était pas acceptable. Pour désactiver l'authentification transparente nous devons laisser le fournisseur d'authentification savoir que la connexion est pas digne de confiance et il a besoin d'authentifier à chaque appel:

static { 
    NTLMAuthenticationCallback.setNTLMAuthenticationCallback(new NTLMAuthenticationCallback() 
    { 
     @Override 
     public boolean isTrustedSite(URL url) 
     { 
      return false; 
     } 
    }); 
} 
0

Il pourrait être aussi le côté serveur requiert une authentification préemptive et redonnons une erreur 405 réponse directement.

L'authentification de base standard http est comme: 1. client sends a request without authentication info. 2. server sends back 401 3. client resend the request with authentication info. 4. server send 200

Pour l'authentification préemptif: 1. client sends a request without authentication info. 2. server sends back 405, because there is no authentication info si getPasswordAuthentication() ne soit pas appelé.

La solution de contournement pour cette situation est d'encoder le nom d'utilisateur: mot de passe et de le mettre dans la tête "Autorisation". (par exemple autorisation: sldsfkjdsfjosdfjosjsdfs de base)

0

Je face à cette question 12.1.1 qui utilisent par défaut http gestionnaire fonctionne pas avec le java.net.Authenticator, peut avoir 2 options pour traiter ceci:

option 1, utilisez http Autorisation sur URL pour éviter java.net.Authenticator.

HttpURLConnection uc = null; 
URL url = new URL(server_URL); 
uc = (HttpURLConnection) url.openConnection(); 
String userPassword = myaccount + ":" + mypassword; 
String encoding = new sun.misc.BASE64Encoder().encode(userPassword.getBytes()); 
uc.setRequestProperty("Authorization", "Basic " + encoding); 

option 2, continuez à utiliser java.net.Authentificateur par config http gestionnaire

Authenticator.setDefault(new MyAuthenticator()); 

URL url = new URL(null, service_URL, new sun.net.www.protocol.http.Handler()); 
uc = (HttpURLConnection) url.openConnection(); 

sinon vous risquez de pouvoir config le soleil gestionnaire http à weblogic 12c dans les deux ou l'un des client ou serveur j'ai oublié de faire cela fonctionne, car il risque sur d'autres applications d'exécution en ce serveur je ne suggérerais pas ici.

Questions connexes