Spring MVCでは、Servlet標準のHttpServletRequest、HttpServletResponse、およびHttpSessionが抽象化されていますが、必要に応じて直接アクセス可能です。以下に代表的な3つの取得手法を紹介します。
1. メソッド引数として直接受け取る
コントローラーのメソッド引数に宣言すると、Spring MVCが自動的に注入します。セッションはrequest.getSession()でも取得可能ですが、引数にHttpSessionを指定すれば直接利用できます。
@PostMapping("/args")
@ResponseBody
public String handleArgs(HttpServletRequest req, HttpServletResponse res, HttpSession sess) {
if (sess == null) {
sess = req.getSession(true);
}
Arrays.stream(req.getCookies())
.forEach(c -> System.out.println(c.getName() + " = " + c.getValue()));
sess.setAttribute("user", "田中太郎");
sess.setAttribute("token", "xyz789");
res.addCookie(new Cookie("user", "田中太郎"));
return "セッションID: " + sess.getId();
}
2. RequestContextHolder経由で取得
現在のスレッドにバインドされたリクエスト情報をRequestContextHolderから取得します。非コントローラークラスでも利用可能です。
@PostMapping("/holder")
@ResponseBody
public Set<String> viaContextHolder() {
ServletRequestAttributes attrs = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
HttpServletRequest req = attrs.getRequest();
HttpServletResponse res = attrs.getResponse();
Arrays.stream(req.getCookies())
.forEach(c -> System.out.println(c.getName() + " = " + c.getValue()));
res.addCookie(new Cookie("user", "田中太郎"));
return res.getHeaderNames();
}
3. フィールドに@Autowiredで注入
クラスフィールドに@Autowiredを付けて依存性注入します。内部的にはRequestContextHolderを利用しており、各リクエストごとに適切なインスタンスが提供されます。
@RestController
public class SessionController {
@Autowired
private HttpServletRequest currentRequest;
@Autowired
private HttpServletResponse currentResponse;
@Autowired
private HttpSession currentSession;
@PostMapping("/field")
@ResponseBody
public Set<String> viaFieldInjection() {
Arrays.stream(currentRequest.getCookies())
.forEach(c -> System.out.println(c.getName() + " = " + c.getValue()));
currentResponse.addCookie(new Cookie("user", "田中太郎"));
return currentResponse.getHeaderNames();
}
}