くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

Spring BootでHTTPセッションをあつかう3つのパターン

Spring BootでHTTPセッションを使う方法は3通りあるらしい。その時の備忘録φ(..)メモメモ

  1. セッション属性(@SessionAttribute)をつかう
  2. セッションスコープBeanをつかう
  3. Http Sessionを直接つかう

セッション属性(@SessionAttribute)をつかう

  • 同一Controller内で完結する場合は、セッション属性をつかう
  • セッション属性で指定したクラスのオブジェクトをHTTPセッション内で管理してくれる
@Controller
@RequestMapping(value = "/user/")
@SessionAttributes(types = UserForm.class)
public class UserAddController {

    @ModelAttribute("userForm")
    public UserForm setupForm() {
        return new UserForm();
    }

    @RequestMapping(path = "/add", method = RequestMethod.GET)
    public String index(Model model) {
        return "user-add";
    }

    @RequestMapping(path = "/add", params = "redo", method = RequestMethod.POST)
    public String redo(Model model) {
        return index(model);
    }

    @RequestMapping(path = "/add", params = "confirm", method = RequestMethod.POST)
    public String confirm(@Validated UserForm form, BindingResult result, Model model) {

        if (result.hasErrors()) return index(model);

       return "user-add-confirm";
    }

    @RequestMapping(path = "/add", params = "complete", method = RequestMethod.POST)
    public String add(@Validated UserForm form, BindingResult result, Model model) {

        if (result.hasErrors())  return index(model);

        return "redirect:/user/add?complete";
    }

    @RequestMapping(path = "/add", params = "complete", method = RequestMethod.GET)
    public String complete(Model model, SessionStatus sessionStatus) {
        sessionStatus.setComplete();
        return "user-add-complete";
    }
}

セッションスコープBeanをつかう

  • 複数のController間で共有したい場合に使う
@Component
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class UserForm implements Serializable {
    // セッションスコープで使いたいBean
}
@Controller
@RequestMapping("/user/add")
public class UserAddController {
    @Autowired UserForm userForm;
}

@Controller
@RequestMapping("/user/edit")
public class UserEditController {
    @Autowired UserForm userForm;
}

Http Sessionを直接つかう

  • Http Sessionを直接使いたい場合は、ControllerでHttpSessionをインジェクトして使う
@Controller
public class FooController {
    
  @Autowired
  HttpSession session;  
  
  @RequestMapping(value = "/save", method = RequestMethod.GET)
  public String save() {
    // 保存
    session.setAttribute("data", "保存したいデータ");
    return "index"
  }
  
  @RequestMapping(value = "/load", method = RequestMethod.GET)
  public String load() {
    String data = session.getAttribute("data");  // 取得
    session.invalidate(); // クリア
    return "index"
  }

以上!!

参考になる書籍

Spring Boot 2 プログラミング入門

Spring Boot 2 プログラミング入門

参考にしたサイト様