Własny protokół URL Scheme, jak uruchomić aplikację desktopową z przeglądarki?

Podczas rozwijania aplikacji webowej np. klasy ERP / CRM, prędzej czy później będziemy musieli wykonać obsługę urządzeń zainstalowanych bezpośrednio na komputerze użytkownika. Może to być komunikacja z kolektorami danych, drukarkami fiskalnymi, obsługa skanera, czy podpisywanie dokumentów podpisem cyfrowym. Część takich rozwiązań mieliśmy w firmie obsłużonych za pomocą appletów Javy, a część za pomocą Java Web Start. Niestety zakończenie wsparcia appletów przez przeglądarki spowodowało konieczność zmiany wykorzystywanej technologii.

Tym razem wróciliśmy do standardowej aplikacji okienkowej instalowanej na komputerze użytkownika. Jednak głównym założeniem było to, aby użytkownik po zalogowaniu do systemu, nie musiał się ponownie logować w kolejnym programie. Jak to zrobić?

Własny protokół URL Scheme

W WizjiNet postanowiliśmy wykorzystać opcję jaką nam dają przeglądarki, a mianowicie wywoływanie innych aplikacji za pomocą odnośników z własnymi nazwami protokołów. Takim protokołem jest np. „mailto:[adres e-mail]”. Kliknięcie w taki odnośnik uruchomi domyślny program pocztowy z ustawionym adresem odbiorcy przekazanym w parametrze. Podobnie jest z „callto:”, który może obsłużyć Skype. Nic nie stoi na przeszkodzie aby stworzyć własną nazwę protokołu i uruchomić jakiś program.

Windows – rejestracja własnego protokołu w rejestrze

Zakładamy, że nazwiemy nasz protokół „notprog”. Aby przeglądarki wiedziały jaki program uruchomić, należy dodać do rejestru Windowsa wpis:

Tak przynajmniej sugeruje Microsoft. To jest niestety zły pomysł. Lepszym wyjściem jest zrobienie wpisu w gałęzi HKEY_CURRENT_USER\Software\Classes\. Dlaczego? A no dlatego, że taka operacja będzie mogła być wykonana z poziomu konta zwykłego użytkownika zamiast z konta administratora.

Dodanie wpisów do rejestru może być wykonywane przez program instalacyjny. Sam korzystam z Inno Setup. Przykład sekcji Registry skryptu instalacyjnego:

 

Uruchomienie aplikacji

Nasz program w Javie musi tylko posiadać statyczną metodą main, w której obsłużymy przekazane parametry:

Automatyczne logowanie

Po stronie serwera stworzyłem dwie usługi REST’ową i Web Socketową. Proces automatycznego logowania do desktopowej aplikacji użytkownika zalogowanego po stronie webowej:

  1. Klik użytkownika.
  2. Wysłanie żądania do usługi RESTowej.
  3. Usługa RESTowa zwraca tymczasowy token dostępu.
  4. JavaScript wywołuje protokół: „notprog:[parametry, w tym token dostępu]”.
  5. Uruchamia się aplikacja na komputerze użytkownika.
  6. Do usługi RESTowej po stronie serwera wysyłane jest żądanie logowania z tymczasowym tokenem z poziomu aplikacji desktopowej.
  7. Jeśli operacja przebiegła pomyślnie, aplikacja desktopowa nawiązuje połączenie Web Socketowe z serwerem.

Podsumowanie

Rozwiązanie wgrałem w tym tygodniu na środowisko produkcyjne jednego z miejskich zarządów oświaty i wykorzystywane jest do:

  • podpisywania dokumentów PDF podpisami cyfrowymi,
  • obsługi skanera,
  • obsługi kolektorów danych w celu przeprowadzania inwentaryzacji.

Oczywiście implementacja jest trochę bardziej zaawansowana niż ta opisana tutaj bo są wprowadzone takie funkcje jak:

  • zautomatyzowany build aplikacji: kompilacja wszystkiego do jednego pliku jar, kompilacja do exe, kompilacja instalatora.
  • działanie w tle, widoczny tylko tray icon,
  • wykrywanie zainstalowanego protokołu w JavaScript w przeglądarkach Firefox, Opera, IE (problemy z chromem)
  • automatyczne nawiązywanie połączeń,
  • kodowanie parametrów protokołu w Base64,
  • pobieranie aktualizacji,
  • pobieranie logów sesji aplikacji dekstopowej z poziomu konta web aplikacji,
  • i wiele innych.

Aby podpisać jakiś dokument, użytkownik przechodzi do odpowiedniego panelu w web aplikacji. Ta przez napisaną bibliotekę w JavaScript wysyła żądanie do aplikacji desktopowej (uruchamia ją jeśli nie jest nawiązane połączenie). Na formularzu wyświetlają się dostępne podpisy cyfrowe, użytkownik zatwierdza i znowu wysyłane jest żądanie do aplikacji desktopowej. Na komputerze użytkownika pliki są podpisywane i wysyłane do usługi RESTowej, która je zapisuje na serwerze.

Rozwiązanie działa błyskawicznie. Nie ma w ogóle co porównywać z appletami Javy.

Z pewnością w przyszłości opiszę to rozwiązanie bardziej szczegółowo.

Patroni Notatnika Programisty

Dziękuję za wsparcie bloga Michałowi Hurko-Romeyko!

Ty również możesz zostać patronem Notatnika Programisty!

To również może Cię zainteresować:

  • Odroid C1+, Odrobian i Kiosk modeOdroid C1+, Odrobian i Kiosk mode W jednym z naszych wdrożeń systemu ERP pojawiło się zapotrzebowanie na zaprojektowanie możliwości prezentacji aktualnego stanu na dockach załadunkowych w magazynie na przemysłowym […]
  • Java JNA, user32.dll – przechwytujemy aplikacje okienkoweJava JNA, user32.dll – przechwytujemy aplikacje okienkowe Zdarzają się takie sytuacje, że chcielibyśmy naszym programem sterować inną aplikacją okienkową. W tym artykule wprowadzę was w temat pobierania danych z programów windowsowych za pomocą […]
  • Odczyt tekstu z plików PDF w JavieOdczyt tekstu z plików PDF w Javie Załóżmy, że zlecono nam wykonanie zadania odczytu faktur od klientów. Dokumenty będziemy otrzymywać w plikach PDF, z których należy pobrać pewne dane tekstowe. Poniżej przedstawię dwa […]
  • Termotransferowa drukarka etykiet Zebra P4TTermotransferowa drukarka etykiet Zebra P4T W ostatnim czasie pracowałem nad systemem dla dużej amerykańskiej firmy, który miał usprawnić zarządzanie zleceniami dla operatorów wózków widłowych w magazynie. Importujemy dane […]
  • Permutacje, cz. 2 – algorytmyPermutacje, cz. 2 – algorytmy W poprzednim wpisie programistyczne rozwiązanie zagadki polegało na wygenerowaniu wszystkich permutacji zbioru i sprawdzeniu każdej z nich pod względem spełnienia warunku […]
  • Koniec z appletami JavyKoniec z appletami Javy Pod koniec zeszłego roku wielu producentów przeglądarek usunęło lub zaplanowało usunięcie wsparcia dla wtyczek NPAPI. NPAPI to API do tworzenia wtyczek w przeglądarkach internetowych, […]

One thought on “Własny protokół URL Scheme, jak uruchomić aplikację desktopową z przeglądarki?

  1. Może jeszcze ten fragment by nie zawadziło opisać w następnym jako tą drugą stronę zagadnienia (żeby był komplet :)): wykrywanie zainstalowanego protokołu w JavaScript w przeglądarkach Firefox, Opera, IE (problemy z chromem).

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *