Program Tip

HTTP 및 HTTPS 요청 모두에 대해 서블릿에서 전체 URL 및 쿼리 문자열 가져 오기

programtip 2020. 10. 23. 08:19
반응형

HTTP 및 HTTPS 요청 모두에 대해 서블릿에서 전체 URL 및 쿼리 문자열 가져 오기


요청 된 URL 또는 전체 경로를 검색하는 코드를 작성 중입니다. 이 코드를 작성했습니다.

HttpServletRequest request;//obtained from other functions
String uri = request.getRequestURI();
if (request.getQueryString() != null)
    uri += "?" + request.getQueryString();

그래서 내가 찾아 볼 때 http://google.com?q=abc괜찮습니다 (정확합니다). 그러나 내가 검색 할 때 문제가 있습니다 https://google.com. 의 값은 uri입니다 http://google.com:443google.com:443. 따라서 프로그램 HTTPS은 사용되는 경우에만 해당되지 않습니다 .

그리고 출력은 request.getRequestURL().toString().

해결책은 무엇인가?


의도적으로 getRequestURL()쿼리 문자열 만 누락 된 전체 URL을 제공합니다.

에서는 HttpServletRequest아래 방법을 사용하여 URI의 개별 부분을 가져올 수 있습니다.

// Example: http://myhost:8080/people?lastname=Fox&age=30

String uri = request.getScheme() + "://" +   // "http" + "://
             request.getServerName() +       // "myhost"
             ":" +                           // ":"
             request.getServerPort() +       // "8080"
             request.getRequestURI() +       // "/people"
             "?" +                           // "?"
             request.getQueryString();       // "lastname=Fox&age=30"
  • .getScheme()요청 "https"이라면 줄 것 https://domain입니다.
  • .getServerName()에 제공 domain합니다 http(s)://domain.
  • .getServerPort() 당신에게 항구를 줄 것입니다.

아래 스 니펫을 사용하세요.

String uri = request.getScheme() + "://" +
             request.getServerName() + 
             ("http".equals(request.getScheme()) && request.getServerPort() == 80 || "https".equals(request.getScheme()) && request.getServerPort() == 443 ? "" : ":" + request.getServerPort() ) +
             request.getRequestURI() +
            (request.getQueryString() != null ? "?" + request.getQueryString() : "");

위의 스 니펫은 전체 URI를 가져 와서 기본 포트가 사용 된 경우 포트를 숨기고 "?"후자가 제공되지 않은 경우 쿼리 문자열을 추가 하지 않습니다.


프록시 요청

요청이 프록시를 통과하는 경우 X-Forwarded-Proto스키마가 변경 될 수 있으므로 헤더 를 확인해야합니다 .

request.getHeader("X-Forwarded-Proto")

또한 공통 헤더는 X-Forwarded-For프록시 IP 대신 원래 요청 IP를 표시하는입니다.

request.getHeader("X-Forwarded-For")

프록시 /로드 밸런서의 구성을 직접 담당하는 경우 이러한 헤더가 전달시 설정되었는지 확인해야합니다.


간단히 사용 :

String Uri = request.getRequestURL()+"?"+request.getQueryString();

• 그래도 사실 HTTPS요청이됩니다 HTTP당신은 서버 측의 URL을 구성하려고 할 때 당신은 프록시 / 부하 분산 (있을 수 있음을 나타냅니다 nginx, pound등) 오프로드 SSL 암호화 앞에 앞으로 일반에 백 엔드 서비스를 HTTP.

그럴 경우 확인하십시오.

  1. 프록시는 (제대로 앞으로 헤더에 설정되어 있는지 Host, X-forwarded-proto, X-forwarded-for, 등).
  2. 서비스 컨테이너 (예 Tomcat)가 앞에있는 프록시를 인식하도록 설정 되었는지 여부 . 예를 들어, 속성을 Tomcat추가 secure="true" scheme="https" proxyPort="443"해야합니다.Connector
  3. 코드 또는 서비스 컨테이너가 헤더를 올바르게 처리하는지 여부. 예를 들어 TomcatschemeremoteAddr추가 RemoteIpValve때, 등의 값을 자동으로 바꿉니다 Engine. ( 구성 가이드 , JavaDoc 참조 ) 따라서 코드에서 이러한 헤더를 수동으로 처리 할 필요가 없습니다.

때 잘못된 프록시 헤더 값이 잘못 출력 될 수 있습니다 request.getRequestURI()또는 request.getRequestURL()원래 URL을 구성하려고 시도합니다.

참고 URL : https://stackoverflow.com/questions/16675191/get-full-url-and-query-string-in-servlet-for-both-http-and-https-requests

반응형