如何在Spring Boot中设置会话属性?

4

我希望设置一个会话属性,名称由用户发送。 用户将首先登录。 当他登录时,我希望将他的用户名设置为会话属性。

我该怎么做?

这是我的控制器:

@GetMapping("/login")
public String login() {
    return "Login";
}

@PostMapping("/loginCheck")
public String checkLogin(@ModelAttribute("users") Users user) {
    if (userService.checkUser(user)) {
        return "redirect:/"+user.getUsername()+"/";
    } else {
        return "Login";
    }
}

@PostMapping("/signup")
public ModelAndView createuser(@ModelAttribute("users") Users user) {
    if (userService.checkUser(user)) {
        return new ModelAndView("Login");
    } else {
        userService.adduser(user);
        return new ModelAndView("Login");
    }
}


现在我如何将user.getUsername()中获取的用户名设置为会话(session)?

3个回答

6

在SpringMVC中,您可以通过将HttpSession作为参数添加到您的方法中来自动注入它。因此,您的登录可能类似于:

@GetMapping("/login")
public String login(@ModelAttribute("users") Users user, HttpSession session)
{
    if(userService.authUser(user)) { //Made this method up
        session.setAttribute("username", user.getUsername());
        view.setViewName("homepage"); //Made up view
    }
    else{
        return new ModelAndView("Login");
    }
}

1
如果您使用Spring Security,则可以注册一个bean来监听Spring Security的InteractiveAuthenticationSuccessEventSessionDestroyedEvent事件。在默认的Spring Boot环境中,这些事件会在没有任何显式配置的情况下触发。
请参见https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#web.security

Web应用程序默认提供以下基本功能:

  • . . .
  • DefaultAuthenticationEventPublisher用于发布身份验证事件。
通过处理这些事件,您可以在用户登录后立即将“用户名”添加为会话属性,并在安全会话(安全上下文)被销毁时删除该属性:
@Component
public class SessionStoreUsernameAuthEventHandler {

  @EventListener
  public void audit(InteractiveAuthenticationSuccessEvent e) {
    getSession().ifPresent(s -> s.setAttribute("username", e.getAuthentication().getName()));
  }

  @EventListener
  public void audit(SessionDestroyedEvent e) {
    getSession().ifPresent(s -> s.removeAttribute("username"));
  }
  
  private static Optional<HttpServletRequest> getCurrentRequest() {
    return Optional.ofNullable(RequestContextHolder.getRequestAttributes())
      .filter(ServletRequestAttributes.class::isInstance)
      .map(ServletRequestAttributes.class::cast)
      .map(ServletRequestAttributes::getRequest);
  }

  private static Optional<HttpSession> getSession() {
    return getCurrentRequest().map(HttpServletRequest::getSession);
  }
}

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接