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
.
그럴 경우 확인하십시오.
- 프록시는 (제대로 앞으로 헤더에 설정되어 있는지
Host
,X-forwarded-proto
,X-forwarded-for
, 등). - 서비스 컨테이너 (예
Tomcat
)가 앞에있는 프록시를 인식하도록 설정 되었는지 여부 . 예를 들어, 속성을Tomcat
추가secure="true" scheme="https" proxyPort="443"
해야합니다.Connector
- 코드 또는 서비스 컨테이너가 헤더를 올바르게 처리하는지 여부. 예를 들어
Tomcat
는scheme
에remoteAddr
추가RemoteIpValve
할 때, 등의 값을 자동으로 바꿉니다Engine
. ( 구성 가이드 , JavaDoc 참조 ) 따라서 코드에서 이러한 헤더를 수동으로 처리 할 필요가 없습니다.
때 잘못된 프록시 헤더 값이 잘못 출력 될 수 있습니다 request.getRequestURI()
또는 request.getRequestURL()
원래 URL을 구성하려고 시도합니다.
'Program Tip' 카테고리의 다른 글
window.onbeforeunload 및 window.onunload가 Firefox, Safari, Opera에서 작동하지 않습니까? (0) | 2020.10.23 |
---|---|
상위 폴더가없는 경우 파일을 작성하는 방법은 무엇입니까? (0) | 2020.10.23 |
Intellij Idea를 사용하여 Java 프로젝트에서 Jenkinsfile 구문 강조 (0) | 2020.10.23 |
.NET에서 기본 프린터를 얻는 가장 좋은 방법은 무엇입니까? (0) | 2020.10.23 |
GUID에는 몇 개의 문자가 있습니까? (0) | 2020.10.23 |