itsource

Spring MVC "redirect:" 접두사는 항상 http로 리디렉션됩니다. 어떻게 하면 https를 유지할 수 있습니까?

mycopycode 2023. 8. 5. 10:08
반응형

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

반응형