tokuhirom's blog

Spring Boot で redirect: とかなってるやつを自分で拡張したい

通常の Spring Boot では redirect:/ とか書くと、Moved Temporaly になるけど Moved Permanently 返したいときがある。

そんなとき、以下のような答えがインターネッツを検索していると出てくる。

  • @ResponseStatus(value=HttpStatus.MOVED_PERMANENTLY) ってコントローラメソッドに付与するって方法がある
    • メソッド全体にかかってくるのがダサい。
  • httpServletReqeust.setAttribute(View.RESPONSE_STATUS_ATTRIBUTE, 302) でやる
    • わかりづらい

そういうわけで、redirect301:/hoge/ とかでできるようにしたらいいんじゃないかと思いつく。 この似非 URL みたいなやつは ViewResolver ってやつがハンドリングしている。

ViewResolver は https://github.com/spring-projects/spring-framework/blob/554bf49/spring-webmvc/src/main/java/org/springframework/web/servlet/DispatcherServlet.java#L700 のへんで集められるが、要するに DI で ViewResolver をねじ込めば良い。

Spring Boot の場合、以下のようにすればよい。ViewResolver は複数指定できて、順番に呼び出される感じになっている。apache module のような呼びだされ方を想定しておけば良い。

@Slf4j
@Configuration
public class WebConfig implements ServletContextAware {
    @Bean
    public ViewResolver myViewResolver() {
        return (viewName, locale) -> {
            final String header = "redirect301:";
            if (viewName.startsWith(header)) {
                String redirectUrl = viewName.substring(header.length());
                RedirectView view = new RedirectView(redirectUrl, true, true);
                view.setStatusCode(HttpStatus.MOVED_PERMANENTLY);
                return view;
            } else {
                return null; // DECLINED
            }
        };
    }
}
Created: 2016-02-06 01:05:08 +0000
Updated: 2016-02-06 01:05:08 +0000