Я внедряю одну функцию входа в систему с использованием Quarkus. Процесс включает API A /Login, где после успешного входа в ответ генерируется и возвращается токен JWT. Токен также сохраняется в базе данных. Тем не менее, я сталкиваюсь с проблемами при использовании Quarkus-hibernate-reactive , и я сталкиваюсь с ошибкой:
»сеанс/EntityManager закрыт»
Ниже приведен код, который я использую для проверки токена для входа в единый сеанс. Не могли бы вы предоставить руководство о том, как правильно внедрить вход в отдельный сеанс в реактивной среде Quarkus, а также любые ссылки, которые могут помочь? < /P>
package asc.qrs.common;
import asc.qrs.repository.UserSessionRepository;
import io.quarkus.logging.Log;
import io.smallrye.mutiny.Uni;
import jakarta.annotation.Priority;
import jakarta.inject.Inject;
import jakarta.ws.rs.container.ContainerRequestContext;
import jakarta.ws.rs.container.ContainerRequestFilter;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.ext.Provider;
@Provider
@Priority(1)
public class SingleSessionFilter implements ContainerRequestFilter {
@Inject
UserSessionRepository userSessionRepository;
@Override
public void filter(ContainerRequestContext requestContext) {
String path = requestContext.getUriInfo().getPath();
if (path.equals(AppConstant.USER_LOGIN)) {
return; // Skip token validation for the login endpoint
}
Log.info("SingleSessionFilter started");
String header = requestContext.getHeaderString("Authorization");
if (header != null && header.startsWith("Bearer ")) {
String token = header.substring(7);
Log.infof("Extracted token: %s", token);
// Use reactive validation of the token
checkTokenValidity(token)
.subscribe().with(
isValid -> {
if (!isValid) {
Log.infof("Invalid token detected: %s", token);
abortRequest(requestContext, Response.Status.UNAUTHORIZED, "Invalid token");
} else {
Log.infof("Token is valid: %s", token);
}
},
failure -> {
Log.errorf("Error during token validation: %s", failure.getMessage());
abortRequest(requestContext, Response.Status.INTERNAL_SERVER_ERROR, "Internal error occurred");
}
);
} else {
Log.info("Authorization header missing or invalid");
abortRequest(requestContext, Response.Status.UNAUTHORIZED, "Authorization header is missing or invalid");
}
}
private Uni checkTokenValidity(String token) {
return userSessionRepository.countByToken(token)
.onItem().transform(count -> count > 0);
}
private void abortRequest(ContainerRequestContext requestContext, Response.Status status, String message) {
requestContext.abortWith(
Response.status(status).entity(message).build()
);
}
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... -time-with
Одно сеанс вход с использованием Quarkus: реализация одного сеанса в время с Quarkus-Hibernate-Reactive ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение