Spring MVC では、特定の HTTP メソッド(例:GET)のみをインターセプトするカスタムインターセプタを実装できます。以下にその設定方法と、コントローラメソッド内で HttpServletRequest や HttpSession を取得する方法を示します。
GET リクエスト専用のインターセプタの実装
まず、HandlerInterceptor を実装したインターセプタクラスを作成します(HandlerInterceptorAdapter は非推奨のため、直接インターフェースを実装します):
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class GetRequestInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler) {
if ("GET".equalsIgnoreCase(req.getMethod())) {
System.out.println("GET リクエストを検知: " + req.getRequestURI());
// false を返すとリクエスト処理が中断される
return false;
}
return true;
}
}
次に、このインターセプタを Spring 設定ファイル(XML)または Java 設定クラスで登録します。XML 設定の例は以下の通りです:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean class="com.example.GetRequestInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
これにより、すべてのパス(/**)に対する GET リクエストがインターセプトされ、処理が中断されます。POST や PUT などの他のメソッドは影響を受けません。
コントローラ内で HttpServletRequest と HttpSession を取得する
Spring MVC では、コントローラメソッドの引数として直接 HttpServletRequest や HttpSession を宣言できます。フレームワークが自動的に現在のリクエストコンテキストから対応するインスタンスを注入します。
@Controller
public class SampleController {
@GetMapping("/info")
public String handleRequest(HttpServletRequest request, HttpSession session) {
// リクエストパラメータの取得
String query = request.getParameter("q");
// セッションへの属性設定
session.setAttribute("lastAccess", System.currentTimeMillis());
return "result";
}
}
このように、メソッドシグネチャに必要な Servlet API オブジェクトを追加するだけで、リクエストやセッション情報にアクセスできます。特別な設定は不要です。
補足:HTTP メソッド別のマッピング例
Spring MVC では、各 HTTP メソッドに対応したアノテーションを使用してエンドポイントを定義できます:
@GetMapping("/users/{id}") // GET
public User getUser(@PathVariable Long id) { ... }
@PostMapping("/users") // POST
public String createUser(@RequestBody User user) { ... }
@PutMapping("/users/{id}") // PUT
public User updateUser(@PathVariable Long id, @RequestBody User user) { ... }
@DeleteMapping("/users/{id}") // DELETE
public void deleteUser(@PathVariable Long id) { ... }
これらのアノテーションは @RequestMapping(method = ...) のショートハンドであり、コードの可読性を向上させます。