금융권에서는 보안상의 이유로 GET, POST만 허용하고 PUT, DELETE를 사용하지 못하게 하는 경우가 있다.
zuul gateway를 사용하는 경우 zuul filter를 사용하여 http method를 변경하는 방법이 있다.
예를 들어
UI -> Gateway(zuul) -> App 방식으로 호출하는 경우
UI에서는 GET, POST만 사용하고 Gateway에서 App을 호출하는 경우 실제 HTTP Method로 변경해주는 방법이다.
요청 헤더에 change-method=PUT 으로 요청하면 Gateway 호출시는 POST로 호출하고 zuul에서 App 호출할 때는 PUT으로 변경한다.
예) UI에서 아래와 같이 호출한다.
POST http://localhost:8080/users/users
change-method: PUT
이런 경우
UI (POST) -> Gateway(PUT) -> App
zuul filter에 대한 예제코드이다.
@Component
public class ChangeHttpMethodFilter extends ZuulFilter {
private static List<String> VALID_METHOD = Arrays.asList("GET", "POST", "PUT", "DELETE");
@Override
public String filterType() {
return "route";
}
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
HttpServletRequest requestWrapper = new PostHttpServletRequest(request);
ctx.setRequest(requestWrapper);
return null;
}
static class PostHttpServletRequest extends HttpServletRequestWrapper {
private String method;
public PostHttpServletRequest(HttpServletRequest request) {
super(request);
String changeMethod = request.getHeader("change-method");
if (changeMethod != null && VALID_METHOD.contains(changeMethod.toUpperCase())) {
this.method = changeMethod;
} else {
this.method = request.getMethod();
}
}
@Override
public String getMethod() {
return method;
}
}
}
반응형