복붙노트

[SPRING] Spring은 파일 확장자를 무시하지 않는다.

SPRING

Spring은 파일 확장자를 무시하지 않는다.

스프링 XML에는 다음과 같은 내용이 있습니다.

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="useDefaultSuffixPattern" value="false"/>
</bean>

<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
            <property name="objectMapper" ref="objectMapper" />
        </bean>        
    </mvc:message-converters>
</mvc:annotation-driven>

내가 이해하는 바로는, 이것은 "abc"에 대한 매핑이있을 때 Spring이 "abc. *"와 "abc /"를 등록해서는 안된다는 것을 의미합니다.

내 컨트롤러 중 하나에서 응답에 이미지를 쓰는 메서드가 있습니다.

@RequestMapping(value="{path}", method=RequestMethod.GET, produces=MediaType.IMAGE_PNG_VALUE)
@ResponseBody
public void getPath(
        @PathVariable String path,
        HttpServletResponse res) {

    ...
}

이것은 "abc"와 같은 것을 요청할 때 멋지지만, "abc.com"을 요청하면 텍스트에 406 오류가 발생합니다.

The resource identified by this request is only capable of generating responses with characteristics not acceptable according to the request "accept" headers."

"abc.img"를 요청하면 "path"매개 변수는 "abc"라는 텍스트 만 수신합니다. Spring은 확장을 생략한다.

Spring이 접미사 패턴을 올바르게 무시하지 않는 것 같습니다. 왜 이런거야?

편집 : 나는 Dirk의 코멘트에서 java 설정을 번역했고 다음 XML이이 문제를 해결하는 것으로 보인다.

<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
    <property name="favorPathExtension" value="false" />
</bean>

<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager">
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
            <property name="objectMapper" ref="objectMapper" />
        </bean>        
    </mvc:message-converters>
</mvc:annotation-driven>

내가 갖고있는 원래 코드가 왜 작동하지 않는지 아직 확실하지 않지만 문제가 해결되었습니다.

해결법

  1. ==============================

    1.요청이 스프링 디스패처로 들어 오면 컨트롤러 매핑 / 일치의 일부는 클라이언트 쪽의 승인 된 미디어 유형을 컨트롤러 쪽의 생산 가능한 미디어 유형과 일치시키는 것입니다 (따라서 제작 된 미디어 유형으로 만 구분할 수있는 컨트롤러를 가질 수 있습니다) .

    요청이 스프링 디스패처로 들어 오면 컨트롤러 매핑 / 일치의 일부는 클라이언트 쪽의 승인 된 미디어 유형을 컨트롤러 쪽의 생산 가능한 미디어 유형과 일치시키는 것입니다 (따라서 제작 된 미디어 유형으로 만 구분할 수있는 컨트롤러를 가질 수 있습니다) .

    나쁜 소식은 기본 설정의 springmvc가 요청의 모든 승인 헤더에 대해 요청 된 URL의 확장을 선호한다는 것입니다.

    예를 들어, abc를 요청할 때 확장에 일치하는 항목이 없으므로 다른 중점 협상 전략이 최종적으로 적합한 유형 (승인 헤더를 통해)으로 진행됩니다. 그러나 abc.com을 요청하면 spring은 컨트롤러의 생성과 일치하지 않는 406 개의 (일치하는 컨트롤러가 없기 때문에) 애플리케이션 / 옥텟 스트림의 MIME 유형을 유도합니다.

    org / springframework / mail / javamail / mime.types (https://github.com/spring-projects/spring-framework/blob 참조)의 spring-context-support.jar에서 경로 확장에 대한 기본 MIME 일치를 찾을 수 있습니다. /master/spring-context-support/src/main/resources/org/springframework/mail/javamail/mime.types#L278).

    Dispatcher 구성에서이 '기능'을 사용 중지 할 수 있으므로 spring은 경로 확장을 사용하여 MIME 유형을 해결하지 않습니다.

    <bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
        <property name="favorPathExtension" value="false" />
    </bean>
    

    자바 구성을 사용하고 있다면 내 관련 질문 / 답변을보십시오.

  2. from https://stackoverflow.com/questions/23578742/spring-does-not-ignore-file-extension by cc-by-sa and MIT license