Mam taką sytuacje, że z gui potrzebuje przekierować poprzez window.location.href, więc idzie metodą GET do api. w jax-rs mam metodę post(wylogowanie) do tego celu, a więc dostaje kod 405. W jaki najlepszy sposób mógłbym to ograć? Coś czytałem, że springBoot ogrywa to poprzez endpoint pośredni get, a później robi post? Macie jakie pomysłe?
Jeśli otwierasz stronę przez przeglądarkę to zawsze jest robiony GET, nie da się zrobić POST.
Żeby zrobić post musisz wykonać fetch z javascript.
await fetch("https://example/api", {
method: "POST"
});
Możesz też zmienić z POST na GET ten endpoint do wylogowania.
Ze względów bezpieczeństwa wolałbym aby endpoint w api był POST. Tak jak mówiłem, springBoot ma w sobie taki mechanizm aby taką sytuacje obsłużyć. Czy spotkał się ktoś z tym po stronie jax-rs?
Możesz jeszcze zrobić formularz i go wysłać z javascript, wtedy pójdzie post z redirectem.
W sensie jaki formularz? Nie o to chodzi. Aktualnie na gui jest zrobione poprzez 'window.location.href', bo przy http.post leciały chyba corsy. W tym momencie przekierowujemy do logout poprzez window.location.href ale tutaj leci 405, bo uderzamy jako get
Jak cors leciał, to znaczy, że Rest API wysyła, że przeglądarka nie powinna pozwalać na wysyłanie do tej domeny z innej domeny.
Musisz ustawić sobie: Access-Control-Allow-Origin: *
A formularz można np. tak wysłać.
const form = document.createElement("form")
form.action = "https://example.pl/"
form.method = "POST"
document.body.append(form)
form.submit()
To nie takie proste, nie jestem od frontu, a wiem że był z tym jakiś problem. Wolałbym pozostać przy window.location.href, bo też tak jest w innych miejscach i obsłużyć problem po stronie api jax-rs. Tylko w jax-rs to nie takie proste, spring przykładowo obsługuje taką sytuacje ale tam troche inny mechanizm i konfiguracja.
To żeby pozwolić na fetch POST to dodaj Access-Control allow *
a żeby pozwolić na href.location
, to dodaj endpoint GET w jax-rs, zrób żeby POST i GET do /wylogowanie prowadziły do tej samej funkcji.
Generalnie na backendzie to możesz co najwyżej, zwrócic odpowiedni status + nagłówki. A to jak częśc kliencka to handluje to zależy tylko od danego klienta.
Natomiast nie ma to nic wspólnego z jax-rs.
https://developer.mozilla.org/en-US/docs/Web/HTTP/Redirections
Schadoow napisał(a):
Generalnie na backendzie to możesz co najwyżej, zwrócic odpowiedni status + nagłówki. A to jak częśc kliencka to handluje to zależy tylko od danego klienta.
Natomiast nie ma to nic wspólnego z jax-rs.https://developer.mozilla.org/en-US/docs/Web/HTTP/Redirections
Wydaje mi się, że troche ma wspólnego. Bo przykładowo spring security domyślnie ogrywa takie sytuacje po swojej stronie
Weba ostatni raz robiłem w 2006, ale czy Filtr nie rozwiązuje problemu? Dla JAX-RS (javax.ws.rs.container.ContainerRequestFilter)
Wywoływany jest zanim request trafi do zasobu, więc tam możesz czary mary zrobić.
@Provider
@PreMatching
public class MojFiltr implements ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
if ("GET".equalsIgnoreCase(requestContext.getMethod()) &&
"/jednak-postem".equals(requestContext.getUriInfo().getPath())) {
requestContext.setMethod("POST");
}
}
}
@mariusz00: redirect jest robiony w przeglądarce poza zwróceniem odpowiedniego 3xx + nagłówkow, backend nie uczestniczy dalej. Generalnie przeglądarka po dostaniu 302 + location header powinna sama to ogarnąć. Nie ma kompletnie znaczenia jaki serwer HTTP jest na backendzie.
A jak bardzo zależy ci żeby zacząć flow postem to googlaj PRG pattern.
Przy czym miej w głowie ze redirect pójdzie pierwszy przed czymkolwiek na froncie.