source

스프링 MVC @PathVariable이 잘립니다.

manycodes 2022. 11. 16. 21:31
반응형

스프링 MVC @PathVariable이 잘립니다.

다음 정보에 대한 RESTful 액세스를 제공하는 컨트롤러가 있습니다.

@RequestMapping(method = RequestMethod.GET, value = Routes.BLAH_GET + "/{blahName}")
public ModelAndView getBlah(@PathVariable String blahName, HttpServletRequest request,
                            HttpServletResponse response) {

제가 겪고 있는 문제는 특수문자가 포함된 경로변수로 서버를 치면 서버가 잘리는 것입니다.: http://localhost:8080/blah-server/blah/get/blah2010.08.19-02:25:47

파라미터 blahName은 blah2010.08이 됩니다.

단, request.getRequestURI() 호출에는 전달된 모든 정보가 포함됩니다.

스프링이 @PathVariable을 자르지 않도록 할 방법이 있나요?

여러분도 정규 을 사용해 보세요.@RequestMapping★★★★

RequestMapping(method = RequestMethod.GET, value = Routes.BLAH_GET + "/{blahName:.+}")

이것은 SPR-6164와 밀접하게 관련되어 있을 가능성이 있습니다.간단히 말하면, 프레임워크는 파일 확장자라고 생각되는 것을 삭제하고, URI 해석에 몇개의 스마트를 적용하려고 합니다.이렇게 하면 돌게 되는 효과가 있습니다.blah2010.08.19-02:25:47blah2010.08 「」라고 에,.19-02:25:47을 사용하다

문제에서 와 같이 이을 비활성화하려면 자신의 해야 합니다.DefaultAnnotationHandlerMapping 및 하기.useDefaultSuffixPattern을 property property로 설정합니다.false그러면 기본 동작이 무시되고 데이터에 대한 추행이 중지됩니다.

점 뒤에 있는 것이 과 같은 합니다..json ★★★★★★★★★★★★★★★★★」.xml파라미터를 취득하기 위해서 잘라냅니다.

만약에 ★★★★★★★★★★★★★★★★★★★★★★★./{blahName}:

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

을 '하다'로 /{blahName:.+}제시된 바와 같이 마지막 점을 포함한 모든 점이 파라미터의 일부로 간주됩니다.

  • /param에서는 값 "이행"을 가 생성됩니다.param
  • /param.json에서는 값 "이행"을 가 생성됩니다.param.json
  • /param.xml에서는 값 "이행"을 가 생성됩니다.param.xml
  • /param.anything에서는 값 "이행"을 가 생성됩니다.param.anything
  • /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>

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

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

는 다음과 같은 됩니다./something.{blahName}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을 요청하기 위해 Spring 티켓을 오픈했습니다.https://jira.springsource.org/browse/SPR-11253관심 있으면 투표해 주세요.

재정의할 때는 사용자 지정 실행 관리 재정의도 고려해야 합니다.그렇지 않으면 모든 사용자 지정 예외 매핑이 실패합니다.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 config xml 을 추가할 수 .DefaultAnnotationHandlerMapping를 설정합니다.useDefaultSuffixPattern로로 합니다.false는 ( ( ) 。true를 참조해 주세요.

xml spring xml을 .mvc-config.xml 어떤 되어도) add ('어느 쪽으로 호출되어도)

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

당신의 ★★★★★★★★★★★★★★★★★.@PathVariable blahName(다른 모든 것도 포함)는 모든 점을 포함한 전체 이름을 포함해야 합니다.

편집: 다음은 spring api 링크입니다.

올바른 Java 컨피규레이션클래스 사용:

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter
{

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

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

저도 같은 문제에 부딪혔는데 속성을 false로 설정해도 도움이 되지 않았습니다., API에는 다음과 같이 표시됩니다.

".xx" 서픽스를 포함하거나 "/"로 끝나는 경로는 기본 서픽스 패턴을 사용하여 변환되지 않습니다.

RESTful URL에 "/end"를 추가하려고 했는데 문제가 해결되었습니다.그 해결책이 마음에 들지 않지만 효과가 있었다.

그나저나 스프링 디자이너들이 이 "기능"을 추가하고 기본 기능을 켰을 때 무슨 생각을 했는지 모르겠습니다.IMHO야, 이거 빼야 돼.

는 이 으로 해결했다.

1) 다음과 같이 @PathVariable에 HttpServletRequest 추가

 @PathVariable("requestParam") String requestParam, HttpServletRequest request) throws Exception { 

2) 요청 내 URL을 직접 취득한다(이 레벨에서는 잘라내지 않는다).

request.getPathInfo() 

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

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

value = {"/username/{id:.+}"}작동하지 않았다

value = "/username/{id:.+}"작동하다

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

방금 이 문제에 부딪혔는데, 이곳의 솔루션은 일반적으로 기대했던 대로 작동하지 않았습니다.

예를 들어 SpEL 식과 여러 매핑을 사용하는 것이 좋습니다.

@RequestMapping(method = RequestMethod.GET, 
    value = {Routes.BLAH_GET + "/{blahName:.+}", 
             Routes.BLAH_GET + "/{blahName}/"})

파일 확장자 문제는 매개 변수가 URL의 마지막 부분에 있는 경우에만 발생합니다. 변경

@RequestMapping(method = RequestMethod.GET, value = Routes.BLAH_GET + "/{blahName}")

로.

@RequestMapping(
   method = RequestMethod.GET, value = Routes.BLAH_GET + "/{blahName}/safe")

그러면 모든 게 다시 좋아질 거야

요구가 송신되는 주소를 편집할 수 있는 경우, 간단한 수정은 요구에 후행 슬래시를 추가하는 것입니다(또한@RequestMapping값):

/path/{variable}/

매핑은 다음과 같습니다.

RequestMapping(method = RequestMethod.GET, value = Routes.BLAH_GET + "/{blahName}/")

Spring MVC @PathVariable with 도트(.)가 잘리고 있는 것도 참조해 주세요.

//in your xml dispatcher  add this property to your default annotation mapper bean as follow
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
    <property name="alwaysUseFullPath" value="true"></property>
</bean>       

이 문제는 스프링이 닷(.) 뒤의 마지막 부분을 .json이나 .xml과 같은 파일 확장자로 해석하기 때문입니다.따라서 스프링이 경로 변수를 해결하려고 하면 uri 끝에 점(.)이 있는 경우 나머지 데이터가 잘라집니다.주의: 이 또한 경로 변수를 URI 끝에 유지한 경우에만 발생합니다.

를 들어 uri:https://localhost/syslog/syslog.df/link.ar를 고려합니다.

@RestController
public class CustomController {
    @GetMapping("/example/{firstValue}/{secondValue}")
    public void example(@PathVariable("firstValue") String firstValue,
      @PathVariable("secondValue") String secondValue) {
        // ...  
    }
}

위의 url firstValue = "secondValue="link"에서 경로 변수가 해석될 때 . 뒤의 마지막 비트가 잘립니다.

이를 방지하기 위해 다음 두 가지 방법이 있습니다.

1) regexp 매핑 사용

매핑 끝 부분에 정규식 사용

@GetMapping("/example/{firstValue}/{secondValue:.+}")   
public void example(
  @PathVariable("firstValue") String firstValue,
  @PathVariable("secondValue") String secondValue) {
    //...
}

+ 를 사용하면 점 뒤의 값도 경로 변수의 일부가 됩니다.

2) @PathVariable 끝에 슬래시 추가

@GetMapping("/example/{firstValue}/{secondValue}/")
public void example(
  @PathVariable("firstValue") String firstValue,
  @PathVariable("secondValue") String secondValue) {
    //...
}

스프링의 기본 동작으로부터 보호하는 두 번째 변수를 포함합니다.

3) Spring 기본 webmvc 구성을 덮어쓰기

스프링은 @EnableWebMvc 주석을 사용하여 Import되는 기본 구성을 재정의하는 방법을 제공합니다.애플리케이션 컨텍스트에서 자체 DefaultAnnotationHandlerMapping bean을 선언하고 useDefaultSuffixPattern 속성을 false로 설정하면 Spring MVC 설정을 맞춤화할 수 있습니다.예:

@Configuration
public class CustomWebConfiguration extends WebMvcConfigurationSupport {

    @Bean
    public RequestMappingHandlerMapping 
      requestMappingHandlerMapping() {

        RequestMappingHandlerMapping handlerMapping
          = super.requestMappingHandlerMapping();
        handlerMapping.setUseSuffixPatternMatch(false);
        return handlerMapping;
    }
}

이 디폴트 설정을 덮어쓰면, 모든 URL 에 영향을 주는 것에 주의해 주세요.

주의: 여기서는 WebMvcConfigurationSupport 클래스를 확장하여 기본 메서드를 덮어씁니다.WebMvcConfigurer 인터페이스를 구현하여 디폴트 설정을 덮어쓰는 방법이 하나 더 있습니다.상세한 것에 대하여는, https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/config/annotation/EnableWebMvc.html 를 참조해 주세요.

(비사용 클래스 사용) 절단을 방지하기 위한 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 PolRepWebConfig extends WebMvcConfigurationSupport {

    @Override
    @Bean
    public RequestMappingHandlerMapping requestMappingHandlerMapping() {
        final RequestMappingHandlerMapping handlerMapping = super
                .requestMappingHandlerMapping();
        // disable the truncation after .
        handlerMapping.setUseSuffixPatternMatch(false);
        // disable the truncation after ;
        handlerMapping.setRemoveSemicolonContent(false);
        return handlerMapping;
    }
}

출처 : http://www.javacodegeeks.com/2013/01/spring-mvc-customizing-requestmappinghandlermapping.html

갱신:

상기의 어프로치를 사용했을 때에, Spring Boot 자동 설정에 문제가 있는 것을 알았습니다(일부 자동 설정이 유효하게 되지 않는 경우도 있습니다).

나는 ㅇㅇㅇㅇ, , 는, 퓨, 퓨, insteadBeanPostProcessor it.잘 되는 것요.더 잘 작동하는 것 같았어요.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

public class MyBeanPostProcessor implements BeanPostProcessor {
    private static final Logger logger = LoggerFactory
            .getLogger(MyBeanPostProcessor.class);

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName)
            throws BeansException {
        return bean;
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName)
            throws BeansException {
        if (bean instanceof RequestMappingHandlerMapping) {
            setRemoveSemicolonContent((RequestMappingHandlerMapping) bean,
                    beanName);
            setUseSuffixPatternMatch((RequestMappingHandlerMapping) bean,
                    beanName);
        }
        return bean;
    }

    private void setRemoveSemicolonContent(
            RequestMappingHandlerMapping requestMappingHandlerMapping,
            String beanName) {
        logger.info(
                "Setting 'RemoveSemicolonContent' on 'RequestMappingHandlerMapping'-bean to false. Bean name: {}",
                beanName);
        requestMappingHandlerMapping.setRemoveSemicolonContent(false);
    }

    private void setUseSuffixPatternMatch(
            RequestMappingHandlerMapping requestMappingHandlerMapping,
            String beanName) {
        logger.info(
                "Setting 'UseSuffixPatternMatch' on 'RequestMappingHandlerMapping'-bean to false. Bean name: {}",
                beanName);
        requestMappingHandlerMapping.setUseSuffixPatternMatch(false);
    }
}

출처: http://ronaldxq.blogspot.com/2014/10/spring-mvc-setting-alwaysusefullpath-on.html

텍스트가 기본 확장자와 일치하지 않을 경우 다음 코드를 사용할 수 있습니다.

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

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

Spring MVC @PathVariable이 잘리지 않도록 하려면 경로 변수 끝에 후행 슬래시를 추가하는 것이 좋습니다.

예를 들어 다음과 같습니다.

@RequestMapping(value ="/email/{email}/")

따라서 요청은 다음과 같습니다.

http://localhost:8080/api/email/test@test.com/

언급URL : https://stackoverflow.com/questions/3526523/spring-mvc-pathvariable-getting-truncated

반응형