2009-06-17 6 views
0

의 구성으로 request.getServerName() 또는 request.getLocalAddr()에서 tomcat 응답을 조작 할 수 있습니까? 그렇다면 : 어떻게?server.xml

서버가 다른 하위 네트워크의 다른 IP로 알려져 있기 때문에이 설정이 필요합니다.

+0

다른 IP 또는 다른 호스트 이름에 의해서만? – Gandalf

답변

2

내가 아는 한, web.xml에서 간단한 구성 변경만으로 ServletRequest.getServerName() 또는 ServletRequest.getLocalAddr()이 반환 한 값을 변경할 수 없습니다.

그러나 ServletRequest/HttpServletRequest 래퍼를 작성하여 비표준 값을 반환하려는 경우를 제외하고 모든 요청을 원래 요청에 위임 할 수 있습니다. 애플리케이션에 오는 모든 요청을 래핑하려면 Filter을 구현하면 수신 요청을 래핑 한 다음 필터 체인을 따라 래퍼를 전달합니다. 그러면 필터가 web.xml에 구성됩니다. 이 필터 다음의 모든 항목은 래퍼를 투명하게 사용하고 사용자가 제공 한 사용자 지정 값을 가져옵니다.

래퍼는 다음과 같이 수 :

public class WrappedRequest implements ServletRequest { 

    private final ServletRequest original; 

    private String customServerName; 

    public WrappedRequest(ServletRequest original) { 
     this.original = original; 
    } 

    // ... delegate all method calls to original 

    public String getServerName() { 
     if (this.customServerName != null) { 
      return this.customServerName; 
     } 
     return this.original.getServerName(); 
    } 

    public void setServerName(String customServerName) { 
     this.customServerName = customServerName; 
    } 
} 

필터 : 당신은 당신이 톰캣 인스턴스 봉사하는 각 하위 도메인에 대한 가상 호스트 설정을 시도 할 수

public class RequestWrapperFilter implements Filter { 

    private final String serverName; 

    public void init(FilterConfig filterConfig) { 
     this.serverName = filterConfig.getInitParameter("serverName"); 
    } 

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { 
     WrappedRequest wrapped = new WrappedRequest(request); 
     wrapper.setServerName(this.serverName); 

     chain.doFilter(wrapped, response); 
    } 

    public void destroy() { } 
} 
관련 문제