Безопасность Spring предотвращает переход к другому представлению из фонового потока
У меня проблемы с миграцией с Vaadin 14 на Vaadin 23. У меня есть длительная фоновая задача с диалоговым окном прогресса. С Vaadin 14 после завершения задачи я мог перейти к представлению результатов со следующим кодом:
UI ui = UI.getCurrent();
final SecurityContext context = SecurityContextHolder.getContext();
ui.access(() -> {
SecurityContextHolder.setContext(context);
UI.navigate("work-finished-view");
});
С Vaadin 23 я получаю это предупреждение
(ViewAccessChecker.java:147) Preventing navigation to com.vaadin.flow.router.RouteNotFoundError because no HTTP request is available for checking access.
Это код в
com.vaadin.flow.server.auth.ViewAccessChecker
VaadinServletRequest vaadinServletRequest = VaadinServletRequest.getCurrent();
if (vaadinServletRequest == null) {
// This is in a background thread and we cannot access the request
// to check access
getLogger().warn("Preventing navigation to " + targetView.getName()
+ " because no HTTP request is available for checking access.");
beforeEnterEvent.rerouteToError(NotFoundException.class);
return;
}
Как правильно перейти к другому представлению из фонового потока?
1 ответ
Вам нужно будет создать поддельный запрос, который использует значения из держателя контекста безопасности, и установить этот запрос, используя
CurrentInstance.set(VaadinRequest.class, request);
. Вполне выполнимо, но не очень красиво.
Вместо того, чтобы писать здесь длинный и хакерский пример того, как это можно сделать, я потратил время на создание запроса на включение, чтобы в будущем это работало из коробки: https://github.com/vaadin/flow/pull/13675