Authenticator

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo,

ich habe eine Klasse, die unteranderem auch eine Methode zum Herunterladen einer Webpage darstellt. Dies sollte auch mit passwortgeschützten Seiten funktionieren, weshalb im Konstruktor eine Authentiticator Instanz angelegt wird. Leider wirdklappt das nicht so recht, die Funktion innerhalb der Authenticator Klasse, die gegebenenfalls das Passwort zurückgeben sollte, wird auch im Bedarfsfall nie aufgerufen. Weiß jemand genauer, wie das funktionieren könnte?
Sun hat das ganze hier dokumentiert: http://java.sun.com/javase/6/docs/technotes/guides/net/http-auth.html

Wenn alles in der main Methode steht, klappt es auch. Irgendwie geht wohl meine Instanz verloren...

Code:
public class BlaBla {

	static class MyAuth extends Authenticator {
		private static String username;
                private static String password;

		public MyAuth(String username, String password) {
			MyAuth.username = username;
			MyAuth.password = password;
		}

		protected PasswordAuthentication getPasswordAuthentication() {
			return new PasswordAuthentication(MyAuth.username, MyAuth.password
					.toCharArray());
		}
	}

	private URL url;
	private String content = null;

	public Page(String url) {
                Authenticator.setDefault(new MyAuth("xxx", "yyy"));
		this.setUrl(url);
	}

	private void receiveContent() {
		try {
			BufferedReader in = new BufferedReader(new InputStreamReader(
					this.url.openStream()));
			String temp;
			StringBuilder strb = new StringBuilder();
			while ((temp = in.readLine()) != null) {
				strb.append(temp);
			}
			this.content = strb.toString();
			in.close();

		} catch (IOException e) {
			System.err.println("IO Exception");
			this.content = null;
		}
	}
        [...]

Gruß und Dank schonmal.
 

Der Müde Joe

Top Contributor
Ein kleines Beispiel:

Code:
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.Authenticator;
import java.net.MalformedURLException;
import java.net.PasswordAuthentication;
import java.net.URL;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class AuthDemo extends JFrame {
	private JTextField textField = new JTextField();
	private JTextArea  textArea = new JTextArea();
	
	public AuthDemo() {
		super("AuthDemo");
		
		// Install Authenticator
		Authenticator.setDefault (new MyAuthenticator ());

		add (textField, BorderLayout.NORTH);
		textArea.setEditable(false);
		add (textArea, BorderLayout.CENTER);
    
		textField.addActionListener (new ActionListener() {
			public void actionPerformed (ActionEvent e) {
				String s = textField.getText();
				if (s.length() != 0)
					textArea.setText (fetchURL (s));
			}
		});
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	//get HTML....
	private String fetchURL (String urlString) {
		StringWriter sw = new StringWriter();
		PrintWriter  pw = new PrintWriter(sw);
			try {
					URL url = new URL (urlString);
					InputStream content = (InputStream)url.getContent();
					BufferedReader in = new BufferedReader (new InputStreamReader (content));
					String line;
					while ((line = in.readLine()) != null) {
						pw.println (line);
						System.out.println(line);
					}
			} catch (MalformedURLException e) {
				pw.println ("Invalid URL");
			} catch (IOException e) {
				pw.println ("Error reading URL");
			}
		return sw.toString();
	}
	
	public static void main (String args[]) {
		JFrame f = new AuthDemo();
		f.setSize(300, 300);
		f.setVisible (true);
	}

	class MyAuthenticator extends Authenticator {
		protected PasswordAuthentication getPasswordAuthentication() {
			
			final JDialog pwDialog = new JDialog (AuthDemo.this, "Enter password", true);
			
			pwDialog.setLayout (new GridLayout (0, 1));
			
			JTextField username = new JTextField();
			pwDialog.add (username);
			
			JTextField password = new JTextField();
			pwDialog.add (password);
			
			JButton button = new JButton ("OK");
			pwDialog.add (button);
			button.addActionListener (new ActionListener() {
				public void actionPerformed (ActionEvent e) {
					pwDialog.dispose();
				}
			});
			pwDialog.pack();
			pwDialog.setVisible(true);
			
			System.out.println(username.getText()+" "+password.getText());
			return new PasswordAuthentication (username.getText(), password.getText().toCharArray());
		}
	}
}

Und der WebServer dazu (Du kommst hier ned rein)....

Code:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class WebServer {

	protected void start() {
		ServerSocket s;

		System.out.println("Starting....");
		try {
			s = new ServerSocket(8080);
		} catch (Exception e) {
			System.out.println("Error: " + e);
			return;
		}

		System.out.println("Waiting for connection");
		
		while(true){
			try {
				Socket remote = s.accept();
				System.out.println("Inncoming connection: " + s.getInetAddress());
				BufferedReader in = new BufferedReader(new InputStreamReader(remote.getInputStream()));
				PrintWriter out = new PrintWriter(remote.getOutputStream());

				String str = ".";
				while (!str.equals("")){
					str = in.readLine();
				}

				//send auth
				out.println("HTTP/1.0 401 Unauthorized");
				out.print("WWW-Authenticate:Basic");
				out.println("");

				out.flush();
				remote.close();
			} catch (Exception e) {
				System.out.println("Error: " + e);
			}
		}
	}
  
	public static void main(String args[]) {
		WebServer server = new WebServer();
		server.start();
	}
}

How to:

WebServer starten...
AuthDemo starten...
http://localhost:8080
PW eingeben
 
G

Gast

Gast
Vielen Dank für Deine Hilfe.

Im Gegensatz zu meinem Code wird bei Dir auch die getPasswordAuthentication() Methode aufgerufen. Weißt Du zufällig, warum das bei mir aber nicht klappt?

Gruß.
 
G

Gast

Gast
Ich habe das Problem nun gelöst. Die Crux war die verwendete JRE. Währen mein Projekt die bei Eclipse enthaltene JRE 1.4 benutzte, habe ich selbst auf der Konsole mit JRE 1.5 gearbeitet. Seit ich Eclipse nun auch an die neue Version gewöhnt habe, ist alles in Butter. :)

Gruß und Danke nochmal.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben