Table of Contents
Swagger-UI 포트분리
Swagger-UI 는 개발 이후 제거하는 것이 확실하지만,
포트를 분리해서 외부에서 접근하지 못하도록 하고,
개발중에는 테스트를 계속 하는 방법도 있다.
application.yml
application.yml 에 아래 내용을 추가해준다.
server.port: 8080
swagger:
port: 8088
paths: |
/swagger-ui.html,
/webjars/springfox-swagger-ui/**/*,
/swagger-resources,
/swagger-resources/**/*,
/v2/api-docs
TomcatContainerCustomizer.java
@Component
public class TomcatContainerCustomizer implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {
@Value("${swagger.port}")
private int swaggerPort;
@Value("${swagger.paths}")
private List<String> swaggerPaths;
@Override
public void customize(TomcatServletWebServerFactory factory) {
Connector swaggerConnector = new Connector();
swaggerConnector.setPort(swaggerPort);
factory.addAdditionalTomcatConnectors(swaggerConnector);
}
@Bean
public FilterRegistrationBean<SwaggerFilter> swaggerFilterRegistrationBean() {
FilterRegistrationBean<SwaggerFilter> filterRegistrationBean = new FilterRegistrationBean<>();
filterRegistrationBean.setFilter(new SwaggerFilter());
filterRegistrationBean.setOrder(-100);
filterRegistrationBean.setName("SwaggerFilter");
return filterRegistrationBean;
}
private class SwaggerFilter extends OncePerRequestFilter {
private AntPathMatcher pathMatcher = new AntPathMatcher();
@Override
protected void doFilterInternal(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse,
FilterChain filterChain) throws ServletException, IOException {
boolean isSwaggerPath = swaggerPaths.stream()
.anyMatch(path -> pathMatcher.match(path, httpServletRequest.getServletPath()));
boolean isSwaggerPort = httpServletRequest.getLocalPort() == swaggerPort;
if (isSwaggerPath == isSwaggerPort) {
filterChain.doFilter(httpServletRequest, httpServletResponse);
} else {
httpServletResponse.sendError(404);
}
}
}
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
// registry.addMapping("/**/*").allowedOrigins("http://localhost:" + swaggerPort);
registry.addMapping("/*/*").allowedOrigins("http://localhost:" + swaggerPort);
}
};
}
}
SwaggerConfig
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Value("${server.port}")
private int serverPort;
@Bean
public Docket api() {
ParameterBuilder parameterBuilder = new ParameterBuilder();
List<Parameter> parameters = new ArrayList<>();
parameterBuilder
.name("X-Authorization")
.modelRef(new ModelRef("string"))
.parameterType("header")
.required(false)
.build();
parameters.add(parameterBuilder.build());
return new Docket(DocumentationType.SWAGGER_2)
.host("localhost:" + serverPort)
.globalOperationParameters(parameters)
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.ant("/v1/**"))
.build();
}
}