Session в Spring MVC

311
26 июня 2017, 18:15

Для примера возьмем простой пример. Юзер логиниться на сайт и хочет поменять себе ник на сайте; он заполняет форму, отправляет запрос на контроллер, ииии? Как контроллер или сервис должен знать какому именно юзеру с БД нужно изменить имя?

Answer 1

Во-первых, логин может содержаться в 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. Корочего говоря, тысяча и один способ есть.

READ ALSO
Как разместить 3 блока равномерно?

Как разместить 3 блока равномерно?

Здравствуйте, я только учу html и css, взял из интернета рандомный psd, чтобы попробовать его сверстать и никак не могу понять как можно разместить...

312
Верстка блока, как реализовать?

Верстка блока, как реализовать?

Здравствуйте, верстаю для себя, учусьПочти закончил верстать макет, осталась одна секция и я не знаю как ее реализовать

233
Как сверстать данный элемент?

Как сверстать данный элемент?

Как сверстать такой элемент, чтобы линия была на всю ширину?

224