Не удается получить доступ к атрибутам сеанса в Thymeleaf - PullRequest
0 голосов
/ 11 февраля 2019

Я использую Thymeleaf с Springboot2.1.2, и у меня проблема с доступом к атрибутам сеанса в шаблонах.
Вот код:

Этоодин из контроллеров:

@GetMapping("/profile")
public String getProfile(HttpServletRequest request) {
    HttpSession session = request.getSession(false);
    String email = (String) session.getAttribute("userId");
    User user = userService.getProfile(email);
    session.setAttribute("user", user);
    return "user/profile";
}

и соответствующий вид (html):

<body th:object="${session.user}">
    //some code using the user object here...
</body>

КогдаЯ запускаю приложение, у меня есть исключение:

java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'session' available as request attribute

Я также пробовал #session и что-то еще, они не работали.Тем не менее, в другом контроллере я могу получить доступ к объекту, используя Модель:

@GetMapping("/register/user")
public String registerUser(Model model) {
    model.addAttribute("user", new User());
    return "user/register";
}

И вид такой:

<form th:object="${user}" method="post" action="#" th:action="@{/register/user}">
    //some code using the user object...
</form>

Это сводит меня с ума, так как все учебники, которые я могу найтискажите мне, что я могу получить доступ к атрибутам сеанса по ${session.something}, на самом деле это не работает.
Не могли бы вы мне помочь?

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Вы сохраняете информацию в сеансе, это не видно тимелистом.вам нужно создать модель для вашего шаблона тимелист и добавить атрибут (или сеанс) в модель, а затем вернуть его.

@GetMapping("/profile")
public ModelAndView getProfile(HttpServletRequest request) {
    User user = userService.getProfile(email);
    ModelAndView model = new ModelAndView(NAME_OF_THYMELEAF_PROFILE_FILE);
    model.addObject("user",user);
    return model;
}

Остерегайтесь того, что тимьяф, чтобы увидеть шаблон, он должен быть впуть по умолчанию (ресурсы / шаблоны) или вам нужно определить, где хранятся ваши шаблоны.

Если вы хотите использовать сеанс снова, решение аналогично.

@GetMapping("/profile")
public ModelAndView getProfile(HttpServletRequest request) {
    HttpSession session = request.getSession(false);
    User user = userService.getProfile(email);
    session.setAttribute("user", user);
    ModelAndView model = new 
    ModelAndView(NAME_OF_THYMELEAF_PROFILE_FILE);
    model.addObject("session",session);
    return model;
}

ОБНОВЛЕНИЕ используйте модель ивозвращаемая строка:

@GetMapping("/profile")
public String getProfile(HttpServletRequest request, Model model) {
    HttpSession session = request.getSession(false);
    String email = (String) session.getAttribute("userId");
    User user = userService.getProfile(email);
    session.setAttribute("user", user);
    model.addAttribute("session", session);
    return "user/profile";
}

Я использовал ModelAndView, вы можете сделать то же самое с Model, просто вместо addObject() вы должны использовать addAttribute().

0 голосов
/ 11 февраля 2019

Вы должны использовать Spring-Security с расширениями тимилеф , чтобы выполнить то, что вы хотите.Вот пример того, что вы хотите сделать.Если вы следуете примеру, вы можете получить доступ к пользовательской информации следующим образом:

<div sec:authentication="name"><!-- Display UserName Here --></div>

Обратите внимание, что для spring-boot 2.1.X вы должны использовать следующую зависимость:

<dependency>
    <groupId>org.thymeleaf.extras</groupId>
    <artifactId>thymeleaf-extras-springsecurity4</artifactId>
</dependency>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...