[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.나는 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.맞습니다.하지만 너무 복잡합니다. 주어진 하위 도메인이 있는지 여부에 관계없이 Host 헤더를 확인하는 것이 좋습니다.
맞습니다.하지만 너무 복잡합니다. 주어진 하위 도메인이 있는지 여부에 관계없이 Host 헤더를 확인하는 것이 좋습니다.
그러나이 작업은 실제로 두 번 이상 필요하지 않으므로 메서드 본문에서 수동으로 수행 할 수도 있습니다. 당신이 정말로 많은 곳에서 그것을 필요로한다면, 이상한 요구가 될 것입니다.
from https://stackoverflow.com/questions/10312177/how-to-implement-requestmapping-custom-properties by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring .properties 파일 : 요소를 배열로 가져 오기 (0) | 2018.12.30 |
---|---|
[SPRING] LDAP : 연결 세부 정보로 사용자를 인증하는 방법 (0) | 2018.12.30 |
[SPRING] 봄 MVC 응용 프로그램에서 JSP로 속성 파일의 값을 표시하는 방법 (0) | 2018.12.30 |
[SPRING] Spring JPA와 persistence.xml (0) | 2018.12.30 |
[SPRING] Spring과 Hibernate로 작업 할 때 persistence.xml이 필요합니까? (0) | 2018.12.30 |