JSP/SERVLET
2020.10.03 / 18:19

http 또는 https 요청에서 포트로 호스트 이름을 얻는 방법 (4)

추석돌이
추천 수 3

http 또는 https 요청에서 포트로 호스트 이름을 얻는 방법 (4)

로드 밸런서와 Nginx를 사용한다면 수정 코드없이 설정하십시오.

Nginx :

proxy_set_header       Host $host;  
proxy_set_header  X-Real-IP  $remote_addr;  
proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;  
proxy_set_header X-Forwarded-Proto  $scheme;  

Tomcat의 server.xml 엔진 :

<Valve className="org.apache.catalina.valves.RemoteIpValve"  
remoteIpHeader="X-Forwarded-For"  
protocolHeader="X-Forwarded-Proto"  
protocolHeaderHttpsValue="https"/> 

Nginx 구성 파일 만 수정하는 경우 Java 코드는 다음과 같아야합니다.

String XForwardedProto = request.getHeader("X-Forwarded-Proto");

jboss 컨테이너에 두 개의 응용 프로그램을 배포했습니다 (동일한 유닉스 상자). app1에서 요청을 받으면 app2에 해당하는 요청을 프레임해야합니다.

예 :
app1 요청이 http://example.com/context?param1=123
다음 " http://example.com/ "추출해야, 그래서 두 번째 응용 프로그램에 대한 프레임 요청을 할 수 있습니다.

내가 사용하려고 :

  HttpServletRequest.getServerName() & 
  HttpServletRequest.getServerPort() & \
  HttpServletRequest.getHeader("host") 

메소드가 있지만 http 또는 https 일 수 있습니다.

다른 더 좋은 방법이 있다면 알려주십시오. 감사!


서버가 프록시 서버 뒤에있는 경우 프록시 헤더가 설정되어 있는지 확인하십시오.

proxy_set_header X-Forwarded-Proto  $scheme;

올바른 scheme & url 을 얻으려면 springframework 클래스를 사용할 수 있습니다.

public String getUrl(HttpServletRequest request) {
    HttpRequest httpRequest = new ServletServerHttpRequest(request);
    UriComponents uriComponents = UriComponentsBuilder.fromHttpRequest(httpRequest).build();

    String scheme = uriComponents.getScheme();             // http / https
    String serverName = request.getServerName();     // hostname.com
    int serverPort = request.getServerPort();        // 80
    String contextPath = request.getContextPath();   // /app

    // Reconstruct original requesting URL
    StringBuilder url = new StringBuilder();
    url.append(scheme).append("://");
    url.append(serverName);

    if (serverPort != 80 && serverPort != 443) {
        url.append(":").append(serverPort);
    }
    url.append(contextPath);
    return url.toString();
}