JAX-RS oraz przekierowanie poprzez window.location.href

0

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?

0

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.

0

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?

0

Możesz jeszcze zrobić formularz i go wysłać z javascript, wtedy pójdzie post z redirectem.

0

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

0

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()
0

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.

0

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.

0

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

0
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

1

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");
        }
    }
}
0

@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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1