Jak połączyć się ze zdalnym adresem URL w Javie, który wymaga uwierzytelnienia. Próbuję znaleźć sposób na zmodyfikowanie następującego kodu, aby móc programowo podać nazwę użytkownika / hasło, aby nie zgłaszał błędu 401.
URL url = new URL(String.format("http://%s/manager/list", _host + ":8080"));
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
java
httpurlconnection
user14128
źródło
źródło
Odpowiedzi:
Możesz ustawić domyślny program uwierzytelniający dla żądań http w następujący sposób:
Ponadto, jeśli potrzebujesz większej elastyczności, możesz sprawdzić Apache HttpClient , który zapewnia więcej opcji uwierzytelniania (a także obsługę sesji itp.)
źródło
Authenticator
dla konkretnegoURL.openConnection()
wywołania zamiast ustawiać je globalnie?HttpURLConnection.setAuthenticator()
. Niestety w Javie 8 i wcześniejszych wystąpienie Authenticator jest zmienną globalną obejmującą całą maszynę JVM. Zobacz: docs.oracle.com/javase/9/docs/api/java/net/…Istnieje natywna i mniej inwazyjna alternatywa, która działa tylko na Twój telefon.
źródło
.trim()
wynik lub wywołasz wariant metody, który nie generuje fragmentów danych wyjściowych.javax.xml.bind.DatatypeConverter
wydaje się bezpieczniejsze.Możesz także skorzystać z następujących, które nie wymagają korzystania z zewnętrznych pakietów:
źródło
--add-modules javax.xml.bind
ponieważ usunęli pakiet z domyślnej ścieżki klas. A w Java11 + jest całkowicie usunięty, potrzebujesz ponownie zewnętrznej zależności. Taki postęp!java.util.Base64
teraz, więc to rzeczywiście postęp :)Jeśli używasz zwykłego logowania podczas wprowadzania nazwy użytkownika i hasła między protokołem a domeną, jest to prostsze. Działa również zi bez logowania.
Przykładowy adres URL: http: // użytkownik: hasł[email protected]/url
Zwróć uwagę w komentarzu od valerybodak, poniżej, jak to się robi w środowisku programistycznym Androida.
źródło
url.getUserInfo()
thorughURLDecoder.decode()
pierwszy (@Peter Rader).Ponieważ przyszedłem tutaj w poszukiwaniu odpowiedzi na Androida-Java, zamierzam zrobić krótkie podsumowanie:
Jeśli chcesz korzystać z java.net.URLConnection z podstawowym uwierzytelnianiem w systemie Android, wypróbuj ten kod:
źródło
Był w stanie ustawić uwierzytelnianie przy użyciu HttpsURLConnection
kilka zmian pobranych z tego postu. a Base64 pochodzi z pakietu java.util.
źródło
Bądź bardzo ostrożny z podejściem "Base64 (). Encode ()", mój zespół i ja otrzymaliśmy 400 problemów z błędnymi żądaniami Apache, ponieważ dodaje \ r \ n na końcu wygenerowanego ciągu.
Okazało się, że przechwytuje pakiety dzięki Wireshark.
Oto nasze rozwiązanie:
Mam nadzieję, że to pomoże!
źródło
Użyj tego kodu do podstawowego uwierzytelnienia.
źródło
Chciałbym udzielić odpowiedzi w przypadku, gdy nie masz kontroli nad kodem otwierającym połączenie. Tak jak zrobiłem, gdy
URLClassLoader
ładowałem plik jar z serwera chronionego hasłem.Authenticator
Rozwiązanie będzie działać, ale ma tę wadę, że najpierw próbuje połączyć się z serwerem bez hasła i dopiero po serwer prosi o hasło zapewnia jeden. To niepotrzebna podróż w obie strony, jeśli już wiesz, że serwer będzie potrzebował hasła.Spowoduje to zarejestrowanie nowego protokołu,
my
który jest zastępowanyhttp
po dodaniu poświadczeń. Więc podczas tworzenia nowegoURLClassLoader
po prostu wymienićhttp
sięmy
i wszystko jest w porządku. Wiem, żeURLClassLoader
zapewnia konstruktor, który przyjmuje,URLStreamHandlerFactory
ale ta fabryka nie jest używana, jeśli adres URL wskazuje na plik jar.źródło
Od wersji Java 9 możesz to zrobić
źródło
setAuthenticator()
metody.WDROŻENIE ANDRODA Kompletna metoda żądania danych / odpowiedzi ciągu z usługi sieciowej żądającej autoryzacji za pomocą nazwy użytkownika i hasła
źródło
Zrobiłem to w ten sposób musisz to zrobić po prostu skopiuj wklej to bądź szczęśliwy
źródło