Как отправить определенную c информацию в заголовке и некоторую информацию в теле в одном JSON ответе на запрос GET при загрузке Spring? - PullRequest
1 голос
/ 07 февраля 2020

В моем загрузочном проекте Spring я создал класс AuthController , в котором я написал код для выполнения запроса POST входа и в ответ показываю сгенерированный токен jwt по этому успешному запросу на вход.

Вот код моего класса AuthController -

@PostMapping("/signin")
public ResponseEntity<?> authenticateUser(@Valid @RequestBody LoginRequest loginRequest) {

    Authentication authentication = authenticationManager.authenticate(
            new UsernamePasswordAuthenticationToken(
                    loginRequest.getUsernameOrEmail(),
                    loginRequest.getPassword()
            )
    );

    SecurityContextHolder.getContext().setAuthentication(authentication);

    String jwt = tokenProvider.generateToken(authentication);
    return ResponseEntity.ok(new JwtAuthenticationResponse(jwt));
}

И вот ответ, который я получаю, когда запрос на вход успешно-

{
  "accessToken": "abcd",
  "tokenType": "Bearer"
}

---- Теперь проблема в том, что ---

Мне нужно сделать что-то другое. Я хочу, чтобы этот accessToken отправлял в ответ HEADER , а не Тело ответа . В теле ответа я хочу отправить UserId и по электронной почте в ответе JSON. Я понятия не имею, как это сделать. Поэтому было бы неплохо, если бы кто-нибудь помог мне сделать это с помощью примера кода или внесения некоторых изменений в код, который я дал.

1 Ответ

1 голос
/ 07 февраля 2020

Попробуйте использовать HttpServletResponse для добавления заголовков ответов.

@PostMapping("/signin")
public ResponseEntity<?> authenticateUser(@Valid @RequestBody LoginRequest loginRequest,
                                          HttpServletResponse response) {

    Authentication authentication = authenticationManager.authenticate(
            new UsernamePasswordAuthenticationToken(
                    loginRequest.getUsernameOrEmail(),
                    loginRequest.getPassword()
            )
    );

    SecurityContextHolder.getContext().setAuthentication(authentication);

    String jwt = tokenProvider.generateToken(authentication);

    // set headers here
    response.addHeader("accessToken", jwt);      
    response.addHeader("tokenType", "Bearer");

    JwtAuthenticationResponse response = new JwtAuthenticationResponse();
    response.setUserId(/*userId here*/);
    response.setEmail(/*email here*/);

    return ResponseEntity.ok(response);
}

И в ваших JwtAuthenticationResponse добавьте userId и email поля, или просто используйте другой класс.

public class JwtAuthenticationResponse {

    private Long userId;
    private String email;

    //getters setters
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...