Spring MVC "redirect:" 접두사는 항상 http로 리디렉션됩니다. 어떻게 하면 https를 유지할 수 있습니까?
제가 직접 해결했습니다. 하지만 그렇게 간단한 해결책을 찾는 데 너무 오랜 시간이 걸렸기 때문에, 저는 이것이 여기에 기록될 만하다고 생각했습니다.
InternalResourceViewResolver를 사용하는 일반적인 Spring 3 MVC 설정이 있습니다.
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/" />
<property name="suffix" value=".jsp" />
</bean>
컨트롤러에 매우 간단한 핸들러 방법이 있지만, 이 예를 위해 훨씬 더 단순화되었습니다.
@RequestMapping("/groups")
public String selectGroup() {
return "redirect:/";
}
문제는, 제가 찾아보면,https://my.domain.com/groups
나는 결국http://my.domain.com/
리디렉션 후. (실제로 내 로드 밸런서는 모든 http 요청을 https로 리디렉션하지만, 이는 해당 경보를 설정한 사용자에 대해 "보안 연결에서 탈퇴/입력 중입니다" 유형의 브라우저 경보를 여러 번 발생시킬 뿐입니다.
그래서 문제는 원래 요청이 사용된 것일 때 어떻게 봄에 https로 리디렉션할 수 있는가 하는 것입니다.
간단한 대답은 InternalResourceViewResolver의 redirectHttp10Compatible 속성을 false로 설정하는 것입니다.
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/" />
<property name="suffix" value=".jsp" />
<property name="redirectHttp10Compatible" value="false" />
</bean>
대신 처리기 메소드가 문자열 대신 보기를 반환하고 직접 리디렉션 보기를 만든 다음 호출하여 요청별로 이 작업을 수행할 수 있습니다.setHttp10Compatible(false)
.
(범인은 Http Servlet Response인 것으로 밝혀졌습니다.sendRedirect - RedirectView에서 HTTP 1.0과 호환되는 리디렉션에 사용합니다.이것은 서블릿 컨테이너의 구현(?)에 의존한다는 것을 의미하는 것 같습니다. Tomcat과 Jetty 모두에서 문제를 관찰했습니다.)
Spring Boot은 프록시 서버 뒤에서 실행 중인 경우 이에 대한 좋은 구성 기반 솔루션을 제공합니다. 이 두 가지 속성을 사용자의 서버에 추가하기만 하면 됩니다.application.properties
파일:
server.tomcat.remote_ip_header=x-forwarded-for
server.tomcat.protocol_header=x-forwarded-proto
이것은 https 로드 밸런서 뒤에 변경되지 않은 spring-boot-sample-web-ui를 Elastic Beanstalk에 배포하는 데 도움이 됩니다.이러한 속성이 없으면 68행으로 리디렉션됩니다.MessageController
기본값은 http이고 중단됩니다.
이게 도움이 되길 바랍니다.
이것을 application.properties에 추가하는 것이 제게 효과적이었습니다.server.tomcat.use-relative-redirects=true
따라서 다음과 같은 경우:
public function redirect() {
return "redirect:/"
}
다음을 제외하고는server.tomcat.use-relative-redirects
그것은 추가할 것입니다.Location
다음과 같은 것:http://my-host.com/
와 함께server.tomcat.use-relative-redirects
다음과 같이 표시됩니다./
따라서 브라우저 관점에서 현재 페이지와 관련이 있을 것입니다.
확실합니까?
코드를 보니 차이가 없는 것 같습니다.두 변형 모두 인코딩된 URL을 사용합니다. 자세한 내용은sendRedirect
리디렉션 보기의 메서드:
String encodedURL = isRemoteHost(targetUrl) ? targetUrl : response.encodeRedirectURL(targetUrl);
if (http10Compatible) {
// Other if/else stuff depending on status code
// Send status code 302 by default.
response.sendRedirect(encodedURL);
}
else {
HttpStatus statusCode = getHttp11StatusCode(request, response, targetUrl);
response.setStatus(statusCode.value());
response.setHeader("Location", encodedURL);
}
저도 같은 문제가 있었는데 로드밸런서 뒤에 tomcat을 설정해서 발생했습니다.로드 밸런서는 SSL 핸드셰이크를 수행하고 일반 http 연결을 Tomcat에 전달합니다.
해결책은 Tomcat이 이 연결을 "신뢰"할 수 있도록 Loadbalancer에 특수 Http 헤더를 보내는 것입니다.서블릿 필터를 사용하면 response.isSecure 플래그를 설정해야 합니다.그런 다음 RedirectView를 덮어쓰고 response.secure인지 확인하고 올바른 방법으로 처리합니다.
나는 이 해결책이 문제를 해결할 수 있을지 확신할 수 없기 때문에 짧게 했습니다.
2 구성을 Spring Boot 2.1에 .application.properties
:
server.use-forward-headers=true
또는application.yml
:
server:
use-forward-headers: true
springmvc를 사용하면 다음을 시도할 수 있습니다.
modelAndView.setView(new RedirectView("redirect url path", true, false));
추가합니다scheme="https"
.xml 이 "" server.xml"인 의 server 파일에 .port="80"
:
<Connector port="80" protocol="HTTP/1.1" URIEncoding="UTF-8"
connectionTimeout="20000" redirectPort="443" scheme="https" />
이것은 Chrome 87에서 발생하기 시작했습니다. (https://blog.chromium.org/2020/08/protecting-google-chrome-users-from.html), 에서 스프링부트 앱의 경고 페이지를 피하기 위한 빠른 수정을 위해 우리는 추가함으로써 그것을 해결합니다.use-relative-redirects: true
에 시대에application.yml
.
저도 같은 문제에 직면해 있었습니다.리디렉션할 때 HTTPS가 아닌 http로 이동합니다. 아래의 변경 사항은 다음과 같습니다.
RedirectView redirect = new RedirectView("/xyz",true);
redirect.setExposeModelAttributes(false);
redirect.setHttp10Compatible(false);
mav = new ModelAndView(redirect);
언급URL : https://stackoverflow.com/questions/3401113/spring-mvc-redirect-prefix-always-redirects-to-http-how-do-i-make-it-stay
'itsource' 카테고리의 다른 글
Instruments ObjectAlloc: 실시간 바이트 및 전체 바이트 설명 (0) | 2023.08.05 |
---|---|
Docker for Windows가 드라이브를 공유할 수 있도록 Windows 방화벽 설정 (0) | 2023.08.05 |
내 Angular2 App에서 @Routes의 모든 경로를 나열/출력하는 방법 (0) | 2023.08.05 |
NgRX 효과 - '관찰 가능' 유형을 '관찰 가능' 유형에 할당할 수 없습니다. (0) | 2023.08.05 |
PowerShell에서 출력 매개 변수를 사용하여 메서드를 호출하는 방법은 무엇입니까? (0) | 2023.08.05 |