Spring MVCでリクエスト、レスポンス、セッションを取得する3つの方法

Spring MVCでは、Servlet標準のHttpServletRequestHttpServletResponse、および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();
    }
}

タグ: SpringMVC HttpServletRequest HttpSession

8月1日 19:04 投稿