[Spring]Spring MVC Interceptor[LKS님의 블로그]
본인의 경우 API Server로 들어오는 모든 요청에서 JWT
검증을 수행하는 Interceptor
를 만들어 사용하고 있었다.
public class JwtInterceptor extends HandlerInterceptorAdapter {
private static final Logger LOG = Logger.getLogger(JwtInterceptor.class);
@Autowired
private AuthService authService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws IOException, JwtException {
String jwt = request.getHeader("Authorization");
if (jwt == null) {
throw new AuthenticationException("JWT is null");
}
try {
authService.vertifyJwt(jwt);
} catch (JwtException e) {
LOG.error("[JwtInterceptor] JwtException Throw");
throw e;
}
return true;
}
}
이때 해당 서버에서 API 문서 관리용으로 Swagger
를 사용 중이었는데,
해당 검증 과정이 Swagger
페이지를 요청할때도 수행되고 있었다.
이를 위해 아래처럼 Interceptor
에서 HttpServletRequest
의 url를 검증하여 Interceptor
에서 제외할 수도 있지만,
public class JwtInterceptor extends HandlerInterceptorAdapter {
private static final Logger LOG = Logger.getLogger(JwtInterceptor.class);
@Autowired
private AuthService authService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws IOException, JwtException {
String url = request.getRequestURI();
if (url.contains("swagger") || url.contains("api-docs") || url.contains("webjars")) {
return true;
}
String jwt = request.getHeader("Authorization");
if (jwt == null) {
throw new AuthenticationException("JWT is null");
}
try {
authService.vertifyJwt(jwt);
} catch (JwtException e) {
LOG.error("[JwtInterceptor] JwtException Throw");
throw e;
}
return true;
}
}
Distpatcher Servlet
의 Context(servlet-context.xml)
안에서 아래와 같이 아예 Interceptor
의 대상 경로에서 제외할 수도 있다.
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean id="loggerInterceptor" class="project.config.logger.LoggerInterceptor"/>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/v2/api-docs"/>
<mvc:exclude-mapping path="/swagger-resources/**"/>
<mvc:exclude-mapping path="/swagger-ui.html"/>
<mvc:exclude-mapping path="/webjars/**"/>
<bean id="jwtInterceptor" class="project.config.interceptor.JwtInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
어떤 방식이 되었던 /v2/api-docs
, swagger-ui
, swagger-resources
, webjars
가 포함된 경로들은,
Swagger
에서 사용하고 있는 경로들이라 검증을 수행하는 Interceptor
라면 제외시켜주면 정상적으로 Swagger
가 동작한다.