Использование ThreadLocal и RequestAttribute для доступа к идентификатору пользователя на разных уровнях приложения.JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Использование ThreadLocal и RequestAttribute для доступа к идентификатору пользователя на разных уровнях приложения.

Сообщение Anonymous »

Я пытаюсь выбрать между двумя подходами к доступу к параметрам на разных уровнях (контроллер, сервис, репозиторий) в приложении Spring MVC. Например:
Подход 1: Использование ThreadLocal

Код: Выделить всё

public class UserContext {
private static final ThreadLocal userIdHolder = new ThreadLocal();

public static void setUserId(Long userId) {
userIdHolder.set(userId);
}

public static Long getUserId() {
return userIdHolder.get();
}

public static void clear() {
userIdHolder.remove();
}
}

@Component
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
Long userId = // get userId from token or somewhere
UserContext.setUserId(userId);
return true;
}

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
UserContext.clear();
}
}

@RestController
public class UserController {
@Autowired
private UserService userService;

@GetMapping("/user/info")
public String getUserInfo() {
return userService.getUserInfo();
}
}

@Service
public class UserService {
@Autowired
private UserRepository userRepository;

public String getUserInfo() {
Long userId = UserContext.getUserId(); // Can access userId directly
return userRepository.findUserInfo(userId);
}
}
Подход 2: использование @RequestAttribute

Код: Выделить всё

@Component
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
Long userId = // get userId from token or somewhere
request.setAttribute("userId", userId);
return true;
}
}

@RestController
public class UserController {
@Autowired
private UserService userService;

@GetMapping("/user/info")
public String getUserInfo(@RequestAttribute("userId") Long userId) {
return userService.getUserInfo(userId);
}
}

@Service
public class UserService {
@Autowired
private UserRepository userRepository;

public String getUserInfo(Long userId) { // Need to pass userId as parameter
return userRepository.findUserInfo(userId);
}
}
Мой вопрос
Какой подход считается лучшим в приложении Spring? Меня особенно интересует:
  • Что обычно выбирают опытные разработчики Spring?
  • Существует ли официальная рекомендация Spring ?
  • Есть ли конкретные сценарии, в которых один подход явно лучше другого?
Этот вопрос больше ориентирован на поиск лучших практик и рекомендаций, а не просто на сравнение технических различий.


Подробнее здесь: https://stackoverflow.com/questions/792 ... ication-la
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»