Как использовать CDI, чтобы получить токен из запроса? - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть такой фильтр, где я проверяю токен, я хочу перенести этот токен за пределы этого класса, потому что я хочу этот токен в другом классе для запроса.

@Override   
public void filter(ContainerRequestContext requestContext) {
    // Get the Authorization header from the request
    String authorizationHeader = requestContext.getHeaderString(HttpHeaders.AUTHORIZATION);
    // Validate the Authorization header
    if (!isTokenBasedAuthentication(authorizationHeader)) {
        abortWithUnauthorized(requestContext);
        return;
    }
    // Extract the token from the Authorization header
    token = authorizationHeader.substring(AUTHENTICATION_SCHEME.length()).trim();
    try {
        // Validate the token
        validateToken(token);
    }

и у меня есть метод в другом классе, подобный следующему: где мне нужен токен?

@Inject
AuthenticationFilter auth;

@GET 
@Secured
@Path("/books") 
@Produces("application/json")
public List<Book> getBooks() { 
    TypedQuery<Book> query = em.createQuery("SELECT s.books from Student s where s.token = :token", Book.class);
    System.out.println("Token: ------- " + auth.getToken());
    query.setParameter("token",auth.getToken());
    List<Book> resultList = query.getResultList();
    return resultList;      
}

Что плохого в этом вводе для получения токена?

1 Ответ

0 голосов
/ 15 апреля 2020

Лучший способ поделиться информацией в области запроса - использовать атрибуты запроса.

В фильтре вы можете сохранить токен как свойство контекста запроса:

requestContext.setProperty(TOKEN_PROPERTY_NAME, token);

Свойства контекста запроса хранятся в качестве атрибутов запроса, а запрос HttpServletRequest может быть добавлен в ваш ресурс с аннотацией @Context. Таким образом, вы можете получить токен с request.getAttribute

@Context
HttpServletRequest request;

@GET 
@Secured
@Path("/books") 
@Produces("application/json")
public List<Book> getBooks() { 
    TypedQuery<Book> query = em.createQuery("SELECT s.books from Student s where s.token = :token", Book.class);

    String token = (String) request.getAttribute(TOKEN_PROPERTY_NAME);

    System.out.println("Token: ------- " + token);
    query.setParameter("token", token);

    List<Book> resultList = query.getResultList();
    return resultList;      
}
...