Ćwiczenie 8. Rozległe sieci komputerowe

Podobne dokumenty
Aplikacja wielowątkowa prosty komunikator

Aplikacja wielow tkowa prosty komunikator

Java wybrane technologie

Kontenery i komponenty graficzne

Java: otwórz okienko. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Java Enterprise Edition spotkanie nr 1 (c.d.) JavaMail

Dokumentacja do API Javy.

Programowanie w języku Java. Wykład 13: Java Platform, Enterprise Edition (Java EE)

JAVA. Strumienie wejścia i wyjścia. Pliki - zapis i odczyt

Java - interfejs graficzny

SWING c.d. przydatne narzędzia: JFileChooser, JOptionPane. drag'n drop, menu kontekstowe.

Materiał pomocniczy do kursu Podstawy programowania Autor: Grzegorz Góralski ggoralski.com

Programowanie obiektowe

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Programowanie graficznego interfejsu użytkownika. Wykład 8. Maciej Wołoszyn 10 maja 2006

Ćwiczenie 1. Kolejki IBM Message Queue (MQ)

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Zaawansowane aplikacje WWW - laboratorium

Programowanie obiektowe

1. Czynności przygotowujące aplikację działającą na platformie Java SE Biblioteka5 (należy ją pobrać z załącznika z p.1)

Język Java część 2 (przykładowa aplikacja)

Aplikacje RMI

Interaktywne aplety obsługa zdarzeń, uruchamianie apletu przez przeglądarkę lub maszynę wirtualną Javy. Tworzenie łącz w apletach

Aplikacje RMI Lab4

Zaawansowane aplikacje internetowe - laboratorium Architektura CORBA.

Multimedia JAVA. Historia

Graphic User Interfaces pakiet Swing

Narzędzia i aplikacje Java EE. Usługi sieciowe Paweł Czarnul pczarnul@eti.pg.gda.pl

Tworzenie elementów graficznych

Katedra Architektury Systemów Komputerowych Wydział Elektroniki, Telekomunikacji i Informatyki Politechniki Gdańskiej

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Programowanie graficznych interfejsów użytkownika

Jakarta POI. POIFS obsługa dokumentów OLE 2, HSSF dokumenty w formacie Excel'a, HWPF proste dokumenty w formacie Word 97,

Rozdział 4 KLASY, OBIEKTY, METODY

Przykłady interfejsu TCP i UDP w Javie

Aplikacje RMI. Budowa aplikacji rozproszonych. Część 2.

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Język JAVA podstawy. wykład 2, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Programowanie Obiektowe GUI

1 Atrybuty i metody klasowe

Sposoby tworzenia projektu zawierającego aplet w środowisku NetBeans. Metody zabezpieczenia komputera użytkownika przed działaniem apletu.

Programowanie obiektowe zastosowanie języka Java SE

Programowanie obiektowe

Java niezbędnik programisty spotkanie nr 12. Graficzny interfejs użytkownika

Platformy Programistyczne Zagadnienia sieciowe i wątki

Bezpieczne uruchamianie apletów wg

Plan wykładu CORBA. Cechy aplikacji rozproszonych. Aplikacje rozproszone

Programowanie obiektowe

Wykład 7: Pakiety i Interfejsy

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1

WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM. NetBeans. Wykonał: Jacek Ventzke informatyka sem.

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

Podejście obiektowe do budowy systemów rozproszonych

Wywoływanie metod zdalnych

Programowanie w Javie

Wątek - definicja. Wykorzystanie kilku rdzeni procesora jednocześnie Zrównoleglenie obliczeń Jednoczesna obsługa ekranu i procesu obliczeniowego

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Aplikacje internetowe i rozproszone - laboratorium

Komponenty sterowane komunikatami

Programy typu klient serwer. Programowanie w środowisku rozproszonym. Wykład 5.

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Języki i metody programowania Java. Wykład 2 (część 2)

Wykład 4_1. Interaktywne aplety obsługa zdarzeń, uruchamianie apletu przez przeglądarkę lub maszynę wirtualną Javy.

Remote Method Invocation 17 listopada 2010

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

Język Java część 2 (przykładowa aplikacja)

Zaawansowane aplikacje internetowe - laboratorium Architektura CORBA.

Sieci komputerowe i bazy danych

Łukasz Przywarty Wrocław, r. Grupa: WT/N 11:15-14:00. Sprawozdanie z zajęć laboratoryjnych: OpenSSL - API

Programowanie obiektowe

Współbieżność w środowisku Java

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Tworzenie i wykorzystanie usług

Aplikacje w Javie- wykład 11 Wątki-podstawy

WPROWADZENIE DO JĘZYKA JAVA

SWING. dr Jarosław Skaruz

SWING ZAGADNIENIA: wprowadzenie, kontenery I komponenty, LayoutManager, komponenty tekstowe.

Wykład 4: Klasy i Metody

Konfiguracja poczty IMO dla urządzeń mobilnych z systemem ios oraz Android.

Wielowątkowość. Programowanie w środowisku rozproszonym. Wykład 1.

Proxy (pełnomocnik) Cel: Zastosowanie: Dostarczyć zamiennik pewnego obiektu, pozwalający kontrolować dostęp do niego.

1 Wątki 1. 2 Tworzenie wątków 1. 3 Synchronizacja 3. 4 Dodatki 3. 5 Algorytmy sortowania 4

Programowanie zdarzeniowe

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Autor: dr inż. Zofia Kruczkiewicz, Programowanie aplikacji internetowych 1

Pakiety i interfejsy. Tomasz Borzyszkowski

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Zdalne wywołanie metod - koncepcja. Oprogramowanie systemów równoległych i rozproszonych Wykład 7. Rodzaje obiektów. Odniesienie do obiektu

Instrukcja konfiguracji funkcji skanowania

1. Co będzie wynikiem wykonania poniŝszych instrukcji? g2d.gettransform().scale(1, -1); g2d.gettransform().translate(4, -8); g2d.drawline(4, 0, 4, 4);

Wywoływanie metod zdalnych

Oprogramowanie systemów równoległych i rozproszonych Wykład 7

Programowanie obiektowe

Java Platform Micro Edition

Programowanie w języku Java

Podejście obiektowe do budowy systemów rozproszonych

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

Transkrypt:

Ćwiczenie 8. Rozległe sieci komputerowe Biblioteka JavaMail API Standardowym rozszerzeniem języka Java 1.6 i kolejnych wersji jest biblioteka klas służąca do pisania zaawansowanych klientów e-mail. Jest ona obowiązkowym składnikiem Java 2 Platform, Enterprise Edition (J2EE). Można je zaimplementować w modelu 100% Pure Java za pomocą gniazd oraz strumieni. Jednakże dzięki JavaMail API nie trzeba się koncentrować na niskopoziomowych szczegółach, a można się skupić na programach, które mogą obsługiwać inne systemy pocztowe (POP3, Lotus Notes itp.). JavaMail API to wysokopoziomowa reprezentacja podstawowych składników dowolnego systemu pocztowego. Poszczególne składniki są reprezentowane przez abstrakcyjne klasy z pakiety javax.mail. Klasy te są abstrakcyjne, gdyż nie czynią żadnych założeń co do sposobu przechowywania poczty lub przesyłania jej pomiędzy komputerami. Poszczególne podklasy dostosowują te abstrakcyjne klasy do danych protokołów i formatów pocztowych. Korzystanie z JavaMailAPI to z grubsza fabryczny sposób projektowania aplikacji. Na przykład protokoły i formaty danych są wybierane za pomocą jednej linii kodu, w której podaje się nazwę protokołu. Zmiana nazwy protokołu spowoduje przystosowanie programu do obsługi innego protokołu. Ponieważ poczta może przybywać w dowolnym momencie, JavaMail API obsługuje pocztę przychodzącą za pomocą zdarzeniowego mechanizmu wywołań zwrotnych. Dokładnie tak samo działają AWT i JavaBeans. Pakiet JavaMail API używają JavaBeans. Pakiet javax.mail.event definiuje kilka różnych zdarzeń pocztowych oraz związane z nimi interfejsy odbiorcze i klasy adaptacyjne. Biblioteka JavaMail API to rozszerzenie Javy, które nie wchodzi w skład biblioteki klas JDK ani JRE. Jest ona dostępna bezpłatnie pod adresem http://java.sun.com/products/javamail/. Biblioteka ta zawiera aktualną wersję Java- Mail API, w tym najważniejszy plik mail.jar, w którym znajdują się pliki.class implementujące JavaMail API. Aby skompilować i uruchomić przykłady do tych ćwiczeń trzeba umieścić ten plik na ścież-ce klas, dodając jego katalog do zmiennej środowiskowej CLASSPATH, albo umieszczając mail.jar w katalogu jre/lib/ext. 1

JavaBeans Activation Framework jest również standardowym rozszerzeniem Javy, a nie częścią podstawowego API. Można je pobrać pod adresem http://java.sun.com/beans/glasgow/jaf.html. Znajduje się w nim plik activation.jar, który również należy umieścić na ścieżce klas. 1. Wysyłanie poczty Wysyłanie poczty odbywa się poprzez wykonanie następujących operacji: 1) Ustawia właściwości mail.host tak, aby wskazywała lokalny serwer pocztowy. 2) Uruchamia sesję pocztową za pomocą metody Session.getInstance(). 3) Tworzy nowy obiekt Message, zwykle konkretyzując jedną z podklas. 4) Ustawia adres nadawcy wiadomości (From:). 5) Ustawia adres odbiorcy wiadomości (To:). 6) Ustawia temat wiadomości (Subject:). 7) Ustawia treść wiadomości. 8) Wysyła wiadomość za pomocą metody Transport.send(). Porządek tych operacji nie musi być ściśle zachowany. Każda z operacji jest wykonywana oddzielnie. Najpierw są ustawiane właściwości sesji pocztowej. W tym celu wystarczy ustawić właściwość mail.host. Jest to obiekt klasy java.util.properties, a nie zmienną środowiskową. Np. poniższy kod Properties props = new Properties(); props.put( mail.host, mail.cloud8.net ); ustawia adres mail.host na adres mail.cloud8.net. Oczywiście należy ustawiać tę właściwość na adres swojego serwera pocztowego. Właściwość tę wykorzystuje się też do pobrania obiektu Session za pomocą metody 2

Session.getInstance(): Session mailconnection = Session.getInstance(props, null); Obiekt Session reprezentuje połączenie między programem a serwerem pocztowym. Drugi argument metody getinstance(), tutaj null, to obiekt javax.mail.authenticator, który poprosi użytkownika o hasło, jeśli serwer tego zażądał. Z reguły nazwę użytkownika i hasło trzeba podać tylko przy odbieraniu poczty, a nie przy wysyłaniu. Obiekt Session jest używany do skonstruowania obiektu Message. W przypadku sieci Internet jest używana konkretna klasa MimeMessage. Następnie są ustawiane pola i treść obiektu Message. Adresy From: i To: są obiektami javax.mail.internet.internetaddress. Można podać adres e-mail albo sam adres i prawdziwe nazwisko, np. Address bill = new InternetAddress( billmicrosoft.com, Bill Gates ); Metoda SetFrom() pozwala określić nadawcę wiadomości przez ustawienie nagłówka From:. Nie ma żadnego zabezpieczenia przed fałszowaniem adresu, można podszyć się pod Billa Gatesa, używając podanego wyżej (fikcyjnego) adresu: msg.setfrom(bill); Metoda SetRecipient() jest bardziej skomplikowana. Nie tylko podaje adres, na który zostanie wysłana wiadomość, ale także sposób interpretacji tego adresu, tzn. czy znajduje się on w polu To:, Cc: czy Bcc:. Określa się to za pomocą trzech stałych klas Message.RecipientType: Message.RecipientType.TO Message.RecipientType.CC Message.RecipientType.BCC Na przykład: msg.setsubject( Czekam na Ciebie. ); 3

Temat ustawia się za pomocą prostego ciągu tekstowego, np.: msg.setsubject( Spotkanie. ); Treść również ustawia się za pomocą jednego ciągu tekstowego. Używa się typu text/plain, np.: msg.setcontent( Mam sprawę do Ciebie., text/plain ); Wreszcie statyczna metoda Transport.send() łączy się z serwerem pocztowym określonym we właściwości mail.host() i wysyła wiadomość w świat: Transport.send(msg); Poniższy przykład ilustruje wysłanie wiadomości. Przykład 1 import javax.mail.*; import javax.mail.internet.*; import java.util.*; public class Assimilator { public static void main(string[] args) { try { Properties props = new Properties props = Properties(); props.put( mail.host, mail.cloud8.net ); Session mailconnection = Session.getInstance(props, null); Message msg = new MimeMessage(mailConnection); Address bill = new InternetAddress( billmicrosoft.com, Bill Gates ); Address jan = new InternetAddress( janekgmail.com ); 4

msg.setcontent( Mam sprawę do Ciebie, text/plain ); msg.setfrom(bill); msg.setrecipient(message.recipienttype.to, jan); msg.setsubject( Spotkanie. ); Transport.send(msg); catch (Exception e) { e.printstacktrace(); Przykład 2. Graficzny klient SMTP Wysyłanie wiadomości przy użyciu prostego interfejsu graficznego przedstawiono poniżej. Kod pocztowy jest zawarty w metodzie actionperformed() i przypomina metodę main z przykładu poprzedniego. Różnica polega na tym, że w poniższym przykładzie host, temat, adresy From: i To: oraz tekst wiadomości są odczytywane ze składników interfejsu graficznego w czasie wykonania, a nie są zakodowane na sztywno". Poniżej zamieszczono kod prostego apletu wysyłającego pocztę. import javax.mail.*; import javax.mail.internet.*; import java.util.*; import javax.swing.*; import java.awt.event.*; import java.awt.*; public class SMPTClient extends JFrame { private JButton sendbutton = new JButton( Wyślij wiadomość ); private JLabel fromlabel = new JLabel( Od: ); private JLabel tolabel = new JLabel( Do: ); private JLabel hostlabel = new JLabel( Serwer SMTP: ); 5

private JLabel subjectlabel = new JLabel( Temat: ); private JLabel fromfield = new JTextField(40); private JTextField tofield = new JTextField(40); private JTextField hostfield = newjtextfield(40); private JTextField subjectfield = new JTextField(40); private JTextArea message = new JTextArea(40, 72); private JScrollPane jsp = new JScrollPane(msg); public SMTPClient() { super( SMTP Client ); Container contentpane = this.getcontentpane(); contentpane.setlayout(new BorderLayout()); JPanel labels = new JPanel(); labels.setlaout(new GridLayout(4, 1)); labels.add(hostlabel); JPanel fields = new JPanel(); fields.setlayout(4, 1)); String host = System.getProperty( mail.host, ); hostfield.settext(host); fields.add(hostfield); labels.add(tolabel); fields.add(tofield); String from = System.getProperty( mail.from, ); fromfield.settext(from); labels.add(fromlabel); fields.add(fromfield); labels.add(subjectlabel); fields.add(subjectfield); Box north = Box.createHorizontalBox(); north.add(labels); north.add(fields); 6

contentpane.add(north, BorderLayout.NORTH); message.setfont(new Font( Monospaced, Font.PLAIN, 12)); contentpane.add(jsp, BorderLayout.CENTER); JPanel south = new JPanel(); south.setlayout(new FlowLayout(FlowLayout.CENTER)); south.add(sendbutton); sendbutton.addactionlistener(new SendAction()); contentpane.add(south, BorderLayout.SOUTH); this.pack(); class SendAction implements ActionListener { public void actionperformed(actionevent evt) { try { Properties props = new Properties(); props.put( mail.host, hostfield.gettext()); Session mailconnection = Session.getInstance(props, null); final Message msg = new MimeMessage(mailConnection); Address to = new InternetAddress(toField.getText()); Addres from = new InternetAddress(fromField.getText()); msg.setcontent(message.gettext(), text/plain ); msg.setfrom(from); msg.setrecipient(message.recipienttype.to, to); msg.setsubject(subjectfield.gettext()); / / Tworzymy wątek w celu wysłania poczty. Runnable r = new Runnable() { public void run() { try { Transport.send(msg); 7

catch (Exception e) { e.printstacktrace(); ; Thread t = new Thread(r); t.start(); message.settext( ); catch (Exception e) { / / Tu powinien być komunikat o błędzie e.printstacktrack(); public static void main(string[] args) { SMTPClient client = new SMTPClient(); client.setdefaultcloseoperation(jframe.exit_on_close); client.show(); 2. Odbieranie poczty Odbieranie poczty jest bardziej złożone niż jej wysłanie. Do uzyskania dostępu do serwerów SMTP wystarczy jedno proste polecenie Helo, co jest przyczyną rozsyłania spamu, natomiast do odbierania poczty zwykle trzeba podawać nazwę użytkownika i hasło. SMTP stosuje 14 różnych poleceń, z których klientowi e- mail wystarczy tylko pięć. Natomiast POP3 używa 12 poleceń, z których wszystkie muszą być obsługiwane przez klienta, a w IMAP4 są aż 24 polecenia. JavaMail API zaprojektowano z założeniem, że wiadomości będą pobierane z serwera IMAP lub NNTP. Jednakże większość użytkowników aktualnie używa protokołu POP, a nie protokołu IMAP4. Z perspektywy JavaMail API, IMAP można traktować za POP uzupełniony o kilka poleceń do manipulowania fold- 8

erami. W prostych zastosowaniach JavaMail API, które operują na folderze IN- BOX, klienty POP oraz IMAP są bardzo podobne. Odczytywanie zdalnej skrzynki pocztowej składa się z około 12 etapów (dokładna liczba może się różnić). Są to: 1. Ustawić właściwości, które będą używane podczas połączenia. 2. Skonstruować obiekt Authenticator, który będzie używany podczas połączenia. 3. Pobrać obiekt Session za pomocą metody Session.getDefaultInstance(). 4. Użyć metody getstore() sesji, aby uzyskać magazyn Store. 5. Połączyć się z magazynem. 6. Pobrać z magazynu folder INBOX za pomocą metody getfolder(). 7. Otworzyć folder INBOX. 8. Otworzyć folder wewnątrz folderu INBOX. Powtarzać dopóki nie znajdziesz szukanego folderu. 9. Pobrać wiadomość z folderu jako tablicę obiektów Message. 10. Przetwarzać elementy tablicy za pomocą metod klasy Message. 11. Zamknąć folder. 12. Zamknąć magazyn. Każdy z etapów polega na określeniu właściwości sesji pocztowej. Jeśli podczas sesji pocztowej będzie tylko pobierana poczta, to wystarczy pusty obiekt Properties. Na przykład: Properties props = new Properties(); Następnie musi być utworzona instancja klasy javax.mail.authenticator, która zapyta użytkownika o hasło. Póki co hasło zostanie zakodowane w programie i przekazana zostanie wartość null zamiast obiektu Authenticator. 9

Później zostanie to zmienione. Authenticator a = null; Następnie używając obiektów Properties oraz Authenticator uzyskujemy instancję klasy Session: Session session = Session.getDefaultInstance(props, a); Następnie prosimy sesję o magazyn konkretnego dostawcy. Tutaj chcemy uzyskać magazyn POP3: Store store = session.getstore( POP3 ); Teraz musi nastąpić połączenie z magazynem za pomocą metody connect(). Musi być określony host, z którym należy się połączyć, oraz nazwa użytkownika i hasło: store.connect( gmail.com, mojenazwisko, moj_password ); Można podać wartość null zamiast hasła, aby poinformować, że o hasło należy zwrócić się do określonego wcześniej obiektu Authenticator. Po połączeniu się z magazynem można otworzyć jeden z jego folderów. Ten etap dotyczy innych protokołów niż POP3 (np. IMAP), gdyż POP3 wrzuca do jednego worka wszystkie wiadomości. W JavaMail API dostawcy POP3 posługują się folderem o nazwie INBOX: Folder inbox = store.getfolder("inbox"); Uzyskany folder jest początkowo zamknięty. Niektóre operacje, jak usunięcia lub zmiana nazwy, mogą być przeprowadzone nawet na zamkniętym folderze. Można też otworzyć folder tylko do odczytu, przekazując do metody open() stałą mnemoniczną Folder.READ_ONLY, a w trybie do odczytu i zapisu Folder.READ_WRITE: 10

inbox.open(folder.read_write); Teraz można pobrać wiadomości. Służy temu metoda getmessages(), która zwraca tablicę z wszystkimi wiadomościami zawartymi w folderze: Message[] messages = inbox.getmessages(); Klasa Message zawiera wiele metod operujących na pojedynczych wiadomościach: do pobierania różnych pól nagłówka, do pobierania treści wiadomości, do odpowiadania na wiadomość itp. Najprostszą możliwą operacją jest wyświetlenie każdej wiadomości na System.out, używając metody writeto() oraz klasy Message: for (int i = 0; i < messages.length; i++) { System.out.println(----- Wiadomosc "+ (i+1) + --------"); messages[i].writeto(system.out); Na zakończenie musi być zamknięty folder, a następnie magazyn wiadomości za pomocą metod close(): inbox.close(false); store.close; Argument false oznacza, że serwer nie powinien rzeczywiście kasować wiadomości usuni?etych z folderu. Chcemy po prostu przerwać połączenie z folderem. Poniższy przykład ilustruje działanie klienta skrzynki pocztowej POP3. Przykład 3. Klient skrzynki pocztowej POP3 import javax.mail.*; import javax.mail.internet.*; import java.util.*; import java.io.*; public class POP3Client { 11

public static void main(string[] args) { Properties props = new Properties(); String host = nasz.serwer.edu ; String username= nazwisko ; String password = mojehaslo ; String provider = pop3 ; try { / / Łączymy się z serwerem POP3 Session session = Session.getDefaultInstance(props, null); Store store = session.getstore(provider); store.connect(host, username, password); / / Otwieramy folder Folder inbox = store.getfolder( INBOX ); if (inbox == null) { System.out.println( Brak folderu INBOX ); System.exit(1); inbox.open(folder.read_only); / / Pobieramy wiadomości z serwera Message[] message = inbox.getmessages(); for (int i = 0; i < messages.length; i++) { System.out.println( Wiadomosc + (i+1) + ); messages[i].writeto(system.out); / / Zamykamy połączenie, ale nie kasujemy wiadomości z serwera inbox.close(false); store.close(); catch (Exception e) { 12

e.printstacktrace(); 3. Uwierzytelnianie za pomoca haseł Uwierzytelnianie poczty za pomocą hase?l zwiększa bezpieczeństwo danych. Hasło nie powinno ukazywać się na ekranie. Byłoby najlepiej, gdyby ono nie było przesyłane jawnym tekstem, choć wiele klientów i serwerów POP3 tak postępuje. Kiedy otwiera się połączenie z magazynem, JavaMail API może obiektu javax.mail.authenticator w celu uzyskania nazwy użytkownika i hasła. Authenticator to klasa abstrakcyjna: public abstract class Authenticator extends Object Kiedy dostawca usług musi uzyskać nazwę użytkownika lub hasło, to wywołuje zwrotnie metodę getpasswordathentication w zdefiniowanej przez użytkownika podklasie Authenticator. Metoda zwraca obiekt PasswordAuthentication, zawierający te informacje: protected PasswordAuthentication getpasswordauthentication() Aby dodać do programu obsługę uwierzytelniania w czasie wykonywania, należy napisać podklasę Authenticator i nadpisać getpasswordauthentication() metodę, która potrafi bezpiecznie zapytać użytkownika o hasło. Do tego nadaje się składnik JPasswordField pakietu Swing. Poniższy przykład oparty na pakiecie Swing używa podklasy Authenticator, która wświetla okno dialogowe z pytaniem o nazwę użytkownika i hasło. Przykład 3. Klasa uwierzytelniajaca z interfejsem graficznym import javax.mail.*; import javax.swing.*; import java.awt.*; import java.awt.event.*; 13

public class MailAuthenticatior extends Authenticator { private JDialog pasworddialog = new JDialog(new JFrame(), true); private JLabel mainlabel = new JLabel( Wpisz nazwę użytkownika i hasło: ); private JLabel userlabel = new JLabel( Nazwa: ); private JLabel passwordlabel = new JLabel( Hasło: ); private JTextField usernamefield = new JTextField(20); private JPasswordField passwordfield = new JPasswordField(20); private JButton okbutton = new JButton( OK ); public MailAuthenticator() { this( ); public MailAuthenticator(String username) { Container pane = passworddialog.getcontentpane(); pane.setlayout(new GridLayout(4, 1)); pane.add(mainlabel); JPanel p2 = new JPanel(); p2.add(userlabel); p2.add(usernamefield); usernamefield.settext(username); pane.add(p2); JPanel p3 = new JPanel(); p3.add(passwordlabel); p3.add(passwordfield); pane.add(p3); JPanel p4 = new JPanel(); p4.add(okbutton); pane.add(p4); passworddialog.pack(); ActionListener al = new HideDialog(); okbutton.addactionlistener(al); usernamefield.addactionlistener(al); passwordfield.addactionlistener(al); 14

class HideDialog implements ActionListener { public void actionperformed(actionevent e) { passworddialog.hide(); public PasswordAuthentication getpasswordauthentication() { passworddialog.show(); String password = new String(passwordField.getPassword()); String username = usernamefield.gettext(); passwordfield.settext( ); return new PasswordAuthentication(username, password); 15