Spring Boot で http → https にリダイレクトする方法

Spring Boot で http → https にリダイレクトする方法 技術ネタ

http → https のリダイレクトはWEBサーバ(Apache、Nginx等)で行うのが普通だと思いますが、どうしても Java(Spring Boot)側でやりたかったので、それについて調べてみました。



前提

本説明は、以下の環境で行っております。

  • JDK : 1.8.0_201
  • Spring Boot : 2.1.3

方法① 個別にリダイレクト

ページ個別にリダイレクトする方法についてです。

やり方としては、ServletUriComponentsBuilder を使ってURLを作成し、それを使ってリダイレクトするだけです。

具体的なコードとしては、以下のようなものになります。
この例では、/test1 ページに httpでアクセスすると、httpsにリダイレクトします。

@GetMapping
@RequestMapping("/test1")
public String test1(HttpServletRequest request,UriComponentsBuilder builder) {
    if(!request.isSecure()) {
        URI location = ServletUriComponentsBuilder.fromCurrentRequest().scheme("https").build().toUri();
        return "redirect:" + location.toString();
    }
    return "test1";
}

方法② 全てのページでリダイレクト

ページ個別ではなく、全ページでリダイレクトさせたい場合の方法です。

やり方としては、Controller が呼び出される前の処理 HandlerInterceptor の preHandle に、同じやり方でURLを生成します。

具体的には、以下のコードで全て(preHandleが通る)ページで http にリダイレクトされます。

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    if(!request.isSecure()) {
        URI location = ServletUriComponentsBuilder.fromCurrentRequest().scheme("https").build().toUri();
        response.sendRedirect(location.toString());
        return false;
    }
    return true;
}
HandlerInterceptor や preHandle についてはググるとたくさん出てきますので、そちらを参照してください。

最後に

冒頭にも書きましたが、httpsへのリダイレクトはWEBサーバ側でやるので、あまりやらないとは思いますが、もし、Java側でリダイレクトする必要が出た際には、参考にしてください。