복붙노트

[SPRING] @RequestMapping 사용자 지정 속성을 구현하는 방법

SPRING

@RequestMapping 사용자 지정 속성을 구현하는 방법

예를 들어 하위 도메인 매핑을 가져옵니다.

이 기사에서는 동일한 애플리케이션에 대해 Google App Engine에서 여러 도메인 및 하위 도메인 관리하기 Filter의 하위 도메인을 해결하고 ServletRequest 헤더에 변수를 할당 할 것을 권장합니다.

그런 다음 매핑은 다음과 같습니다.

@RequestMapping(value = "/path", headers="subdomain=www")
 public String subsiteIndexPage(Model model,HttpServletRequest request) { ... }

하위 도메인과 같이 맞춤 @RequestMapping 속성을 만들고 싶다면 (예 : 다음과 같은 매핑을 만들려면 :

@RequestMapping(value = "/some/action", subdomain = "www")
public String handlerFunction(){ ... }

@RequestMapping @interface 정의를 오버라이드 (override) 해, RequestMappingHandlerMapping의 protected 메소드를 오버라이드 (override) 할 필요가 있습니다. (JIRA에 명시된 바와 같이 : "사용자 정의 요청 매핑 조건 SPR-7812 허용").

맞아? 아무도 힌트를 어떻게 제공 할 수 있습니까?

아이디어 1 : 원래 jira 스레드에서 제안한 것처럼 RequestCondition의 자체 구현을 만드는 것입니다.

github에서 사용할 수있는이 솔루션을 사용하는 프로젝트가 있습니다. https://github.com/rstoyanchev/spring-mvc-31-demo/

그리고 관련 질문 그래서 : 봄 mvc 3.1 사용자 정의 RequestCondition 추가

Type과 Method 모두에 대해 @Subdomain ( "www")과 같은 매핑이 가능한 해결책입니까?

forum.springsource.com에서 같은 질문에 대한 링크

해결법

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

    1.나는 spring-mvc-31 데모 버전을 기반으로 솔루션을 만들었습니다.

    나는 spring-mvc-31 데모 버전을 기반으로 솔루션을 만들었습니다.

    이 솔루션은 Spring 3.1.1.RELEASE 플랫폼의 커스텀 @RequestCondition 기능을 사용합니다.

    용법

    예제 1 :

    @Controller
    @SubdomainMapping(value = "subdomain", tld = ".mydomain.com")
    class MyController1 {
        // Code here will be executed only on address match:
        // subdomain.mydomain.com
    }
    

    예 2 :

    @Controller
    class MyController2 {
    
        @RequestMapping("/index.html")
        @SubdomainMapping("www")
        public function index_www(Map<Object, String> map){
            // on www.domain.com
            // where ".domain.com" is defined in SubdomainMapping.java
        }
    
        @RequestMapping("/index.html")
        @SubdomainMapping("custom")
        public function index_custom(Map<Object, String> map){
            // on custom.domain.com
            // where ".domain.com" is defined in SubdomainMapping.java
        }
    }
    

    우리는 세 개의 파일이 필요합니다.

    SubdomainMapping.java

    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Target({ElementType.METHOD, ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface SubdomainMapping {
    
        /**
        * This param defines single or multiple subdomain
        * Where the Method/Type is valid to be called
        */
        String[] value() default {};
        /**
        * This param defines site domain and tld
        * It's important to put the leading dot
        * Not an array, so cannot be used for mapping multiple domains/tld
        */
        String tld() default ".custom.tld";
    }
    

    SubdomainRequestCondition.java

    import java.net.URL;
    import java.util.Arrays;
    import java.util.Collection;
    import java.util.Collections;
    import java.util.HashSet;
    import java.util.LinkedHashSet;
    import java.util.Set;
    
    import javax.servlet.http.HttpServletRequest;
    
    import org.springframework.web.servlet.mvc.condition.RequestCondition;
    
    public class SubdomainRequestCondition implements
            RequestCondition<SubdomainRequestCondition> {
    
        private final Set<String> subdomains;
        private final String tld;
    
        public SubdomainRequestCondition(String tld, String... subdomains) {
            this(tld, Arrays.asList(subdomains));
        }
    
        public SubdomainRequestCondition(String tld, Collection<String> subdomains) {
            this.subdomains = Collections.unmodifiableSet(new HashSet<String>(
                    subdomains));
            this.tld = tld;
        }
    
        @Override
        public SubdomainRequestCondition combine(SubdomainRequestCondition other) {
            Set<String> allRoles = new LinkedHashSet<String>(this.subdomains);
            allRoles.addAll(other.subdomains);
            return new SubdomainRequestCondition(tld, allRoles);
        }
    
        @Override
        public SubdomainRequestCondition getMatchingCondition(
                HttpServletRequest request) {
            try {
                URL uri = new URL(request.getRequestURL().toString());
                String[] parts = uri.getHost().split(this.tld);
                if (parts.length == 1) {
                    for (String s : this.subdomains) {
                        if (s.equalsIgnoreCase(parts[0])) {
                            return this;
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace(System.err);
            }
            return null;
        }
    
        @Override
        public int compareTo(SubdomainRequestCondition other,
                HttpServletRequest request) {
            return org.apache.commons.collections.CollectionUtils.removeAll(other.subdomains, this.subdomains).size();
        }
    
    }
    

    SubdomainRequestMappingHandlerMapping.java

    import java.lang.reflect.Method;
    
    import org.springframework.core.annotation.AnnotationUtils;
    import org.springframework.web.servlet.mvc.condition.RequestCondition;
    import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
    
    public class CustomRequestMappingHandlerMapping extends
            RequestMappingHandlerMapping {
    
        @Override
        protected RequestCondition<?> getCustomTypeCondition(Class<?> handlerType) {
            SubdomainMapping typeAnnotation = AnnotationUtils.findAnnotation(
                    handlerType, SubdomainMapping.class);
            return createCondition(typeAnnotation);
        }
    
        @Override
        protected RequestCondition<?> getCustomMethodCondition(Method method) {
            SubdomainMapping methodAnnotation = AnnotationUtils.findAnnotation(
                    method, SubdomainMapping.class);
            return createCondition(methodAnnotation);
        }
    
        private RequestCondition<?> createCondition(SubdomainMapping accessMapping) {
            return (accessMapping != null) ? new SubdomainRequestCondition(
                    accessMapping.tld(), accessMapping.value()) : null;
        }
    
    }
    

    설치

    이 솔루션 구현에 대한 자세한 설명은 관련 github 프로젝트를 참조하십시오.

  2. ==============================

    2.맞습니다.하지만 너무 복잡합니다. 주어진 하위 도메인이 있는지 여부에 관계없이 Host 헤더를 확인하는 것이 좋습니다.

    맞습니다.하지만 너무 복잡합니다. 주어진 하위 도메인이 있는지 여부에 관계없이 Host 헤더를 확인하는 것이 좋습니다.

    그러나이 작업은 실제로 두 번 이상 필요하지 않으므로 메서드 본문에서 수동으로 수행 할 수도 있습니다. 당신이 정말로 많은 곳에서 그것을 필요로한다면, 이상한 요구가 될 것입니다.

  3. from https://stackoverflow.com/questions/10312177/how-to-implement-requestmapping-custom-properties by cc-by-sa and MIT license