복붙노트

[SPRING] 슬래시 (/)가 포함 된 요청을 처리하는 방법

SPRING

슬래시 (/)가 포함 된 요청을 처리하는 방법

다음과 같이 요청을 처리해야합니다.

www.example.com/show/abcd/efg?name=alex&family=moore   (does not work)
www.example.com/show/abcdefg?name=alex&family=moore   (works)
www.example.com/show/abcd-efg?name=alex&family=moore   (works)

www.example.com/show/와? 사이에있는 값의 문자를 허용해야합니다. 그곳에있는 값은 행동의 이름이 아닌 하나의 값일 것임을 명심하십시오.

/ show / abcd / efg 및 / show / lkikf? name = 첫 번째 요청이 사용자를 abcd / efg 페이지로 리다이렉트해야하는 잭 (두 번째 이름이기 때문에)과 두 번째 페이지는 사용자를 페이지 lkikf로 리디렉션해야합니다. 매개 변수 이름의 값으로.

나는 그것을 처리 할 수있는 컨트롤러가 있지만 컨트롤러에 주소를 가지고있을 때 문제가 발생합니다.

@RequestMapping(value = "/{mystring:.*}", method = RequestMethod.GET)
public String handleReqShow(
            @PathVariable String mystring,
            @RequestParam(required = false) String name,
            @RequestParam(required = false) String family, Model model)     {

작동하지 않는 정규식 다음에 사용했습니다.

 /^[ A-Za-z0-9_@./#&+-]*$/

해결법

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

    1.@RequestMapping (value = { "/ {string})}} 주석을 갖는 메소드와 @RequestMapping (value = {"/ {string :.+} ","/ {string :. +} / {mystring :. +} "}) 다음 선택적 경로 변수를 가질 수 없으므로 각각에 따라 행동하십시오.

    @RequestMapping (value = { "/ {string})}} 주석을 갖는 메소드와 @RequestMapping (value = {"/ {string :.+} ","/ {string :. +} / {mystring :. +} "}) 다음 선택적 경로 변수를 가질 수 없으므로 각각에 따라 행동하십시오.

    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    
    @Controller
    @RequestMapping("/show")
    public class HelloController {
    
        @RequestMapping(value = { "/{string:.+}" })
        public String handleReqShow(@PathVariable String string,
                @RequestParam(required = false) String name,
                @RequestParam(required = false) String family, Model model) {
            System.out.println(string);
            model.addAttribute("message", "I am called!");
            return "hello";
        }
    
        @RequestMapping(value = { "/{string:.+}", "/{string:.+}/{mystring:.+}" })
        public String whatever(@PathVariable String string,
                @PathVariable String mystring,
                @RequestParam(required = false) String name,
                @RequestParam(required = false) String family, Model model) {
            System.out.println(string);
            System.out.println(mystring);
            model.addAttribute("message", "I am called!");
            return "hello";
        }
    }
    
  2. ==============================

    2.내가하는 또 다른 방법은 다음과 같습니다.

    내가하는 또 다른 방법은 다음과 같습니다.

    @RequestMapping(value = "test_handler/**", method = RequestMethod.GET)
    

    ... 그리고 테스트 핸들러는 "/ test_hanlder / a / b / c"가 될 수 있으며 다음과 같은 메커니즘을 사용하여 전체 값을 얻을 수 있습니다.

    requestedUri = (String) 
    request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);
    
  3. ==============================

    3.컨트롤러에 실제로 매핑되지 않은 완전히 새로운 URL을 처리하려고하기 때문에 첫 번째 URL이 작동하지 않습니다.

    컨트롤러에 실제로 매핑되지 않은 완전히 새로운 URL을 처리하려고하기 때문에 첫 번째 URL이 작동하지 않습니다.

    www.example.com/show/abcd/efg?name=alex&family=moore   (does not work)
    

    위의 URL에 대한 올바른 매핑은 아래 코드와 같을 수 있습니다.

    @RequestMapping(value = {"/{mystring:.*}" , "/{mystring:.*}/{mystring2:.*}"}, method = RequestMethod.GET)
    public String handleReqShow(
            @PathVariable String mystring,
            @PathVariable String mystring2,
            @RequestParam(required = false) String name,
            @RequestParam(required = false) String family, Model model)     {
    

    내 단일 컨트롤러가 여러 유형의 요청을 처리하는 데 사용되는 경우 유사한 개념을 시도했습니다.

  4. ==============================

    4.규칙을 정의하여

    규칙을 정의하여

    <filter>
        <filter-name>UrlRewriteFilter</filter-name>
        <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>UrlRewriteFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
    </filter-mapping>
    

    rules.xml을 WEB-INF에 추가하십시오.

    <urlrewrite>
        <rule>
           <from>^/(10\..*)$</from> <!-- tweak this rule to meet your needs -->
           <to>/Show?temp=$1</to>
        </rule>
    </urlrewrite>
    
  5. ==============================

    5.슬래시를 이스케이프 처리하십시오. 정규식 : / ^ [A-Za-z0-9 _ @. \ / # & + -] * $ /

    슬래시를 이스케이프 처리하십시오. 정규식 : / ^ [A-Za-z0-9 _ @. \ / # & + -] * $ /

  6. ==============================

    6.기본 스프링 MVC 경로 매퍼는 경로 변수에 /를 구분 기호로 사용합니다.

    기본 스프링 MVC 경로 매퍼는 경로 변수에 /를 구분 기호로 사용합니다.

    이 요청을 처리하는 올바른 방법은 특정 처리기 메서드에 대해이 논리를 변경하고 다른 처리기 메서드에 대한 기본값을 위임하는 사용자 지정 경로 매퍼를 작성하는 것입니다.

    그러나 값에서 가능한 최대 슬래시 수를 알고있는 경우 선택적 경로 변수를 허용하는 핸들러를 작성하고 메소드 자체에서 경로 변수 파트의 값을 조합 한 다음 여기에 예제가 작동합니다 최대 1 개의 슬래시는 3 또는 4로 쉽게 확장 할 수 있습니다.

    @RequestMapping(value = {"/{part1}", "/{part1}/{part2}"}, method = RequestMethod.GET)
    public String handleReqShow(
            @PathVariable Map<String, String> pathVariables,
            @RequestParam(required = false) String name,
            @RequestParam(required = false) String family, Model model) {
        String yourValue = "";
        if (pathVariables.containsKey("part1")) {
            String part = pathVariables.get("part1");
            yourValue += " " + part;
        }
        if (pathVariables.containsKey("part2")) {
            String part = pathVariables.get("part2");
            yourValue += " /" + part;
        }
        // do your stuff
    
    }
    

    지도 내부의 모든 경로 변수, 즉 @PathVariable Map pathVariables를 잡을 수는 있지만 매핑의 정적 부분이 가능한 모든 유사 항목을 찾아야한다는 단점이 있습니다

  7. ==============================

    7.% 2f의 UI에서 슬래시를 인코딩 할 수 있습니다 (http://www.example.com/show/abcd%2fefg?name=alex&family=moore). 이제 슬래시를 처리하도록 Spring을 구성해야합니다. 간단한 구성 예 :

    % 2f의 UI에서 슬래시를 인코딩 할 수 있습니다 (http://www.example.com/show/abcd%2fefg?name=alex&family=moore). 이제 슬래시를 처리하도록 Spring을 구성해야합니다. 간단한 구성 예 :

    @RestController
    public class TestController {
    
        @GetMapping("{testId:.+}")
        public String test(@PathVariable String testId) {
            return testId;
        }
    
    
        @GetMapping("{testId:.+}/test/{messageId}")
        public String test2(@PathVariable String testId, @PathVariable String messageId) {
            return testId + " " + messageId;
        }
    
        //Only if using Spring Security
        @Configuration
        public static class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
            @Bean
            public HttpFirewall allowUrlEncodedSlashHttpFirewall() {
                DefaultHttpFirewall firewall = new DefaultHttpFirewall();
                firewall.setAllowUrlEncodedSlash(true);
                return firewall;
            }
            @Override
            public void configure(WebSecurity web) throws Exception {
                web.httpFirewall(allowUrlEncodedSlashHttpFirewall());
            }
        }
    
    
        @Configuration
        @Order(Ordered.HIGHEST_PRECEDENCE)
        public static class SpringMvcConfig extends WebMvcConfigurerAdapter {
            @Override
            public void configurePathMatch(PathMatchConfigurer configurer) {
                UrlPathHelper urlPathHelper = new UrlPathHelper();
                urlPathHelper.setUrlDecode(false);
                configurer.setUrlPathHelper(urlPathHelper);
            }
        }
    
    }
    
  8. from https://stackoverflow.com/questions/31421061/how-to-handle-requests-that-includes-forward-slashes by cc-by-sa and MIT license