Vaadin Front-end и Token / Cookie - PullRequest
       10

Vaadin Front-end и Token / Cookie

0 голосов
/ 04 марта 2019

Я использую nodeJS в серверной среде, и большинство API готово.Я хочу использовать Vaading во внешнем интерфейсе из-за компонента Java Spreadsheet .Я посмотрел пример Bakery и создал страницу входа, которая отправляет учетные данные пользователя в мой внутренний API.Это код для отправки запроса POST на сервер.

public void submit(String username, String password) throws IOException {
        JSONObject json = new JSONObject();
        json.put("username", username);
        json.put("password", password);


        CloseableHttpClient httpClient = HttpClientBuilder.create().build();
        try {
            HttpPost request = new HttpPost(URL);
            HttpResponse response;

            StringEntity params = new StringEntity(json.toString());
            request.addHeader("content-type", "application/json");
            request.setEntity(params);
            response = httpClient.execute(request);
            if(response.getStatusLine().getStatusCode() == 200) {
                System.out.println("Okey!");
                // The response contains token. How can I store this token?
                // Also, How can I use the stored token for future Authentication:Bearer?
            }
        }
        catch(Exception ex) {
            System.out.println(ex);
        }
        finally {
            httpClient.close();
        }
    }

Я хотел бы где-то хранить токен ответа (я могу сохранить его в объекте cookie в React. Однако я незнакомы с этим языком) и извлекайте токен из этого хранилища (возможно, cookie, , как реализовать Cookie в вебе Java? ) каждый раз, когда я делаю запрос.

1 Ответ

0 голосов
/ 07 марта 2019

Какую версию Vaadin вы используете?Если вы используете Vaadin> = 10 : как насчет использования сеанса?

Вы можете сохранить токен в VaadinSession и читать его оттуда при каждом запросе.

Я создал минимальный пример, в котором (при нажатии кнопки) я проверяю, сохранен ли токен в сеансе.Если да, то это напечатано в уведомлении.Если нет, то он сохраняется в сессии.Код выглядит так:

@Route("")
public class MainView extends VerticalLayout {

    public MainView() {
        Button button = new Button("Click me", event -> {
            Object token = VaadinSession.getCurrent().getAttribute("token");
            if (token == null) {
                Notification.show("No token found in session. Now storing token = 123456");
                VaadinSession.getCurrent().setAttribute("token", "123456");
            } else {
                Notification.show("Found token in session: " + token.toString());
            }
        });
        add(button);
    }
}

Результат выглядит следующим образом:

enter image description here

(кнопка была нажата три раза)

Обновление : то же самое можно использовать в Vaadin 8 , где код минимального примера выглядит так:

@Theme("mytheme")
public class MyUI extends UI {

    @Override
    protected void init(VaadinRequest vaadinRequest) {
        final VerticalLayout layout = new VerticalLayout();

        Button button = new Button("Click me", event -> {
            Object token = VaadinSession.getCurrent().getAttribute("token");
            if (token == null) {
                Notification.show("No token found in session. Now storing token = 123456");
                VaadinSession.getCurrent().setAttribute("token", "123456");
            } else {
                Notification.show("Found token in session: " + token.toString());
            }
        });

        layout.addComponents(button);

        setContent(layout);
    }

    @WebServlet(urlPatterns = "/*", name = "MyUIServlet", asyncSupported = true)
    @VaadinServletConfiguration(ui = MyUI.class, productionMode = false)
    public static class MyUIServlet extends VaadinServlet {
    }
}
...