Для примера возьмем простой пример. Юзер логиниться на сайт и хочет поменять себе ник на сайте; он заполняет форму, отправляет запрос на контроллер, ииии? Как контроллер или сервис должен знать какому именно юзеру с БД нужно изменить имя?
Во-первых, логин может содержаться в URL - /users/{userName}
. Во-вторых, идентификатор пользователя может содержаться в скрытом поле формы. В обоих случаях их легко получить и извлечь из базы соответствующую сущность. Только в обоих случаях надо убедиться, что принятые логин/идентификатор соответствуют логину/идентификатору текущего пользователя.
Более элегантное и простое решение при использовании Spring Security - внедрение UsernamePasswordAuthenticationToken в параметр типа Principal:
@Controller
@RequestMapping("/profile")
public class ProfileController {
@RequestMapping(method = RequestMethod.POST)
public String update(ModelMap model, Principal principal) {
// Получаем логин текущего пользователя
String name = principal.getName();
return "redirect:/some-success-url";
}
}
Впрочем, если такое определение метода не подходит по каким-либо причинам, Principal
можно извлечь из SecurityContextHolder:
@Controller
@RequestMapping("/profile")
public class ProfileController {
@RequestMapping(method = RequestMethod.POST)
public ModelAndView update(@ModelAttribute("profile") ProfileDTO profile) {
User user = (User) SecurityContextHolder
.getContext()
.getAuthentication()
.getPrincipal();
String name = user.getUsername();
return "redirect:/some-success-url";
}
}
UPDATE Касательно доступа к сессии
Сессия может быть внедрена параметром контроллера:
@RequestMapping("/some-url")
public void someHandler(HttpSession session, ...) {
session.setAttribute("user", user)
}
или в поле:
@Autowired
private HttpSession httpSession;
Или может быть получена из объекта HttpServletRequest. Который может быть также внедрён параметром:
@RequestMapping("/some-url")
public void someHandler(HttpServletRequest request, ...) {
request.getSession().setAttribute("user", user);
}
или внедрён в поле:
@Autowired
private HttpServletRequest request;
или получен из RequestContextHolder:
ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
HttpSession session = attr.getRequest().getSession();
А ещё с объектами, сохранёнными в сессии, можно работать не используя сессию явно, с помощью аннотации контроллера @SessionAttributes
. Корочего говоря, тысяча и один способ есть.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Здравствуйте, я только учу html и css, взял из интернета рандомный psd, чтобы попробовать его сверстать и никак не могу понять как можно разместить...
Здравствуйте, верстаю для себя, учусьПочти закончил верстать макет, осталась одна секция и я не знаю как ее реализовать