source

스프링 MVC @PathVariable with 닷(.)이 잘려나가고 있습니다.

ittop 2023. 2. 26. 10:33
반응형

스프링 MVC @PathVariable with 닷(.)이 잘려나가고 있습니다.

이것은 스프링 MVC @PathVariable이 잘리는 질문의 계속입니다.

Content Negotiation Manager(3.2)는 다음 이치노
https://jira.springsource.org/browse/SPR-6164httpsjira..org/browse/SPR-6164
https://jira.springsource.org/browse/SPR-7632httpsjira..org/browse/SPR-7632

응용 프로그램 요청에서 .com을 사용하는 매개 변수가 잘립니다.

이 새로운 기능의 사용법을 설명해 주실 수 있나요?xml에서 어떻게 구성할 수 있습니까?

주의: 스프링 포럼 #1 스프링 MVC @PathVariable with(.)이 잘립니다.

이 문제는 요청 매핑 끝에 있는 경로 변수에 대해서만 나타납니다.

regex addon을 request mapping에 정의함으로써 해결할 수 있었습니다.

 /somepath/{variable:.+}

점 뒤에 있는 것이 과 같은 합니다..json ★★★★★★★★★★★★★★★★★」.xml트루카테

만약에 ★★★★★★★★★★★★★★★★★★★★★★★./somepath/{variable}:

  • /somepath/param,/somepath/param.json,/somepath/param.xml ★★★★★★★★★★★★★★★★★」/somepath/param.anything에서는 값 "이행"을 가 생성됩니다.param
  • /somepath/param.value.json,/somepath/param.value.xml ★★★★★★★★★★★★★★★★★」/somepath/param.value.anything에서는 값 "이행"을 가 생성됩니다.param.value

을 「」으로 ./somepath/{variable:.+}바와 같이 한 모든됩니다.

  • /somepath/param에서는 값 "이행"을 가 생성됩니다.param
  • /somepath/param.json에서는 값 "이행"을 가 생성됩니다.param.json
  • /somepath/param.xml에서는 값 "이행"을 가 생성됩니다.param.xml
  • /somepath/param.anything에서는 값 "이행"을 가 생성됩니다.param.anything
  • /somepath/param.value.json에서는 값 "이행"을 가 생성됩니다.param.value.json
  • ...

인식이 없는 내선번호 인식을 할 수 .mvc:annotation-driven 동: :

<bean id="handlerMapping"
      class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
    <property name="contentNegotiationManager" ref="contentNegotiationManager"/>
    <property name="useSuffixPatternMatch" value="false"/>
</bean>

그러니까다시말씀드리지만,/somepath/{variable}:

  • /somepath/param,/somepath/param.json,/somepath/param.xml ★★★★★★★★★★★★★★★★★」/somepath/param.anything에서는 값 "이행"을 가 생성됩니다.param
  • /somepath/param.value.json,/somepath/param.value.xml ★★★★★★★★★★★★★★★★★」/somepath/param.value.anything에서는 값 "이행"을 가 생성됩니다.param.value

는, 「Default Configuration」의 「 Configuration」의 「Default Configuration」의 「Default Configuration」의 「이 있는 경우에만 됩니다.somepath/something.{variable}Resthub 프로젝트 문제 참조

확장 관리를 유지할 경우 Spring 3.2 이후 RequestMappingHandlerMapping bean의 useRegisteredSuffixPatternMatch 속성을 설정하여 suffixPattern 인식을 활성화하지만 등록된 내선으로 한정할 수도 있습니다.

여기서는 json 및 xml 확장자만 정의합니다.

<bean id="handlerMapping"
      class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
    <property name="contentNegotiationManager" ref="contentNegotiationManager"/>
    <property name="useRegisteredSuffixPatternMatch" value="true"/>
</bean>

<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
    <property name="favorPathExtension" value="false"/>
    <property name="favorParameter" value="true"/>
    <property name="mediaTypes">
        <value>
            json=application/json
            xml=application/xml
        </value>
    </property>
</bean>

mvc:drivation-driven은 커스텀빈을 제공하기 위한 contentNegotiation 옵션을 받아들이지만 RequestMappingHandlerMapping 속성을 true(기본값 false)로 변경해야 합니다(cf. https://jira.springsource.org/browse/SPR-7632)).

따라서 mvc:notation-driven 구성을 모두 재정의해야 합니다.커스텀 Request Mapping Handler Mapping : https://jira.springsource.org/browse/SPR-11253을 요청하기 위해 Spring 티켓을 오픈했습니다.관심있으시면 투표해주세요.

덮어쓸 때는 커스텀 실행 관리의 덮어쓰기도 고려해 주십시오.그렇지 않으면 모든 사용자 지정 예외 매핑이 실패합니다.messageCoverters를 목록 bean과 함께 재사용해야 합니다.

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean" />

<util:list id="messageConverters">
    <bean class="your.custom.message.converter.IfAny"></bean>
    <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"></bean>
    <bean class="org.springframework.http.converter.StringHttpMessageConverter"></bean>
    <bean class="org.springframework.http.converter.ResourceHttpMessageConverter"></bean>
    <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"></bean>
    <bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"></bean>
    <bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"></bean>
    <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
</util:list>

<bean name="exceptionHandlerExceptionResolver"
      class="org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver">
    <property name="order" value="0"/>
    <property name="messageConverters" ref="messageConverters"/>
</bean>

<bean name="handlerAdapter"
      class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <property name="webBindingInitializer">
        <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
            <property name="conversionService" ref="conversionService" />
            <property name="validator" ref="validator" />
        </bean>
    </property>
    <property name="messageConverters" ref="messageConverters"/>
</bean>

<bean id="handlerMapping"
      class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
</bean>

저는 오픈 소스 프로젝트인 Resthub에서 이 주제에 대한 일련의 테스트를 구현했습니다.https://github.com/resthub/resthub-spring-stack/pull/219/files 및 https://github.com/resthub/resthub-spring-stack/issues/217를 참조하십시오.

Spring 4 업데이트: 4.0.1 이후로는WebMvcConfigurer),§:

@Configuration
protected static class AllResources extends WebMvcConfigurerAdapter {

    @Override
    public void configurePathMatch(PathMatchConfigurer matcher) {
        matcher.setUseRegisteredSuffixPatternMatch(true);
    }

}


@Configuration
public class WebConfig implements WebMvcConfigurer {

   @Override
   public void configurePathMatch(PathMatchConfigurer configurer) {
       configurer.setUseSuffixPatternMatch(false);
   }
}

xml에서는 (https://jira.spring.io/browse/SPR-10163):

<mvc:annotation-driven>
    [...]
    <mvc:path-matching registered-suffixes-only="true"/>
</mvc:annotation-driven>

Martin Frey의 답변 외에 Request Mapping 값에 후행 슬래시를 추가하여 수정할 수도 있습니다.

/path/{variable}/

이 수정은 유지보수를 지원하지 않습니다.URI를 사용하다이것은 API 사용자나 신규 개발자에게는 분명하지 않을 수 있습니다. 파라미터가 다 것은 입니다..도 있습니다.

Spring Boot Rest Controller에서는 다음 순서로 이러한 문제를 해결했습니다.

Rest Controller:

@GetMapping("/statusByEmail/{email:.+}/")
public String statusByEmail(@PathVariable(value = "email") String email){
  //code
}

Rest 클라이언트:

Get http://mywebhook.com/statusByEmail/abc.test@gmail.com/

":"를 추가합니다.+"는 동작했지만, 외측 곱슬 괄호를 떼어낼 때까지는 동작하지 않았습니다.

값 = {"/disc/{id:}입니다.+}"}(가) 작동하지 않았습니다.

value = "/syslog/{id:" 입니다.+}" 동작

내가 누군가를 도왔길 바래:)

/somepath/{variable:.+}requestMapping붙이다

다음은 순전히 Java 구성에 의존하는 접근 방식입니다.

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;

@Configuration
public class MvcConfig extends WebMvcConfigurationSupport{

    @Bean
    public RequestMappingHandlerMapping requestMappingHandlerMapping() {
        RequestMappingHandlerMapping handlerMapping = super.requestMappingHandlerMapping();
        handlerMapping.setUseSuffixPatternMatch(false);
        handlerMapping.setUseTrailingSlashMatch(false);
        return handlerMapping;
    }
}

이 문제를 해결하는 가장 쉬운 방법 중 하나는 후행 슬래시를 추가하는 것입니다.

예:

사용방법:

/somepath/filename.jpg/

다음 대신:

/somepath/filename.jpg

Spring Boot에서 정규 표현은 다음과 같이 문제를 해결합니다.

@GetMapping("/path/{param1:.+}")

spring 4.2의 패스명에 이메일 주소를 포함한 완전한 솔루션은 다음과 같습니다.

<bean id="contentNegotiationManager"
    class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
    <property name="favorPathExtension" value="false" />
    <property name="favorParameter" value="true" />
    <property name="mediaTypes">
        <value>
            json=application/json
            xml=application/xml
        </value>
    </property>
</bean>
<mvc:annotation-driven
    content-negotiation-manager="contentNegotiationManager">
    <mvc:path-matching suffix-pattern="false" registered-suffixes-only="true" />
</mvc:annotation-driven>

이를 application-xml에 추가합니다.

3.2 및 Spring 3.2.x 를 하는 <mvc:annotation-driven /> 것을 보세요.BeanPostProcessor:

package spring;

public final class DoNotTruncateMyUrls implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof RequestMappingHandlerMapping) {
            ((RequestMappingHandlerMapping)bean).setUseSuffixPatternMatch(false);
        }
        return bean;
    }
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }
}

다음으로 MVC config xml에 다음 내용을 입력합니다.

<bean class="spring.DoNotTruncateMyUrls" />

드디어 Spring Docs에서 해결책을 찾았습니다.

파일 확장자를 완전히 사용하지 않으려면 다음 두 가지를 모두 설정해야 합니다.

 useSuffixPatternMatching(false), see PathMatchConfigurer

 favorPathExtension(false), see ContentNegotiationConfigurer

이것을 나의 것에 추가하다WebMvcConfigurerAdapter구현으로 문제를 해결했습니다.

@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    configurer.favorPathExtension(false);
}

@Override
public void configurePathMatch(PathMatchConfigurer matcher) {
    matcher.setUseSuffixPatternMatch(false);
}

저 같은 경우에는

@GetMapping(path = "/a/{variableName:.+}")

요청 URL의 "dot"을 "%2"로 인코딩하는 경우에만 작동합니다.E"는 작동한다.단, 모든 사용자에게 URL이 필요합니다.이는 유효하지만 "표준" 인코딩이 아닙니다.뭔가 버그 같은 느낌:|

"트레일링 슬래시" 방법과 유사한 다른 방법은 점 "인라인" ex를 갖는 변수를 이동하는 것입니다.

@GetMapping(경로= "/{variableName}/a")

이제 모든 점이 보존되므로 수정할 필요가 없습니다.

백엔드와 프런트엔드를 모두 쓸 경우 URL 끝에 /를 붙이는 것도 간단한 방법입니다.이 경우 백엔드를 변경할 필요가 없습니다.

somepath/myemail@gmail.com/

행복하세요!

스프링 5.2.4(스프링 부트 v2.2.6).릴리스)PathMatchConfigurer.setUseSuffixPatternMatch그리고.ContentNegotiationConfigurer.favorPathExtension는 폐지되었습니다(https://github.com/spring-projects/spring-framework/issues/24179) 및 https://github.com/spring-projects/spring-framework/issues/24179)).

진짜 문제는 클라이언트가 특정 미디어 유형(.com 등)을 요구하는데 Spring은 기본적으로 이러한 모든 미디어 유형을 추가한다는 것입니다.대부분의 경우 REST 컨트롤러는 JSON만 생성하므로 요청된 출력 형식(.com)을 지원하지 않습니다.이 문제를 해결하려면 나머지 컨트롤러(또는 특정 방법)를 업데이트하여 'out' 형식을 지원해야 합니다.@RequestMapping(produces = MediaType.ALL_VALUE과 할 수 있습니다.{username:.+}를 참조해 주세요.

예:

@RequestMapping(value = USERNAME, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public class UsernameAPI {

    private final UsernameService service;

    @GetMapping(value = "/{username:.+}", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.ALL_VALUE)
    public ResponseEntity isUsernameAlreadyInUse(@PathVariable(value = "username") @Valid @Size(max = 255) String username) {
        log.debug("Check if username already exists");
        if (service.doesUsernameExist(username)) {
            return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
        }
        return ResponseEntity.notFound().build();
    }
}

스프링 5.3 이후에는 등록된 서픽스(미디어 타입)에만 일치합니다.

Spring 3.2+ 를 사용하고 있는 경우는, 이하의 솔루션이 도움이 됩니다.하여 URI의 regex 패턴을 적용하는 더잘됩니다.예를 URI의 regex의 regex의 regex가 허용됩니다./somepath/{variable:.+}

xml 파일에 bean을 정의합니다.

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
        <property name="useSuffixPatternMatch" value="false"/>
        <property name="useRegisteredSuffixPatternMatch" value="true"/>
    </bean>

플래그 사용 방법은 설명서를 참조하십시오.설명 좀 해주시죠

useRegisteredSuffixPatternMatch의 exlanation으로 문제가 해결되었다고 합니다.클래스의 Java 문서에서

활성화 되어 있는 경우 "/users"에 매핑된 컨트롤러 메서드는 ".json"이 지정된 {@link #setContentNegotiationManager(ContentNegotiationManager) contentNegotiationManager}에 등록된 파일 확장자라고 가정하여 "/users.json"과도 일치합니다.이것은, 특정의 URL 확장자만을 사용할 수 있도록 하는 경우나, URL 패스의 「.」가 패스 변수 컨텐츠(예를 들면, 「/users/john.joe」나 「/users/john.joe.json」등의 착신 URL 를 애매하게 해석하는 경우에 도움이 됩니다.

간단한 솔루션 수정: regex {q:} 추가.@RequestMapping의 +}

@RequestMapping("medici/james/Site")
public class WebSiteController {

    @RequestMapping(value = "/{site:.+}", method = RequestMethod.GET)
    public ModelAndView display(@PathVariable("site") String site) {
        return getModelAndView(site, "web site");

    }
}

이제 /site/jamesmedice.com 입력에 대해 "site"에 올바른 james 사이트가 표시됩니다.

언급URL : https://stackoverflow.com/questions/16332092/spring-mvc-pathvariable-with-dot-is-getting-truncated

반응형