Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring MVC subdomain / 5 сообщений из 5, страница 1 из 1
16.05.2012, 16:21:23
    #37797394
grief
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC subdomain
Снова с вопросом касательно Spring MVC
В данный момент есть следующая конструкция запроса http://mydomain.com/mypage
А у меня интерес сделать так http://mypage.mydomain.com
Не подскажите в каком направлении необходимо копать
Мое предположение что в сторону HandlerInterceptor?
...
Рейтинг: 0 / 0
16.05.2012, 16:22:38
    #37797399
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC subdomain
Это обычно делается на уровне веб-сервера, а не самого приложения.
...
Рейтинг: 0 / 0
17.05.2012, 08:08:15
    #37798129
grief
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC subdomain
Не согласен, на уровне веб сервера + сервера имен выполняется регистрация субдомена и парковка оного.
А на уровне приложения производится перехват SubdomainRequestCondition из колекции выглядит приблизительно так @SubdomainMapping("www") ну и @SubdomainMapping("other"). При указании над методом он производит выборку если субдомен www то основной инстанс иначе страница пользователя. Это уже готово.

Кому надо вот код:
1. SubdomainMapping.java
2. SubdomainRequestCondition.java
3. SubdomainRequestMappingHandlerMapping.java

Это решение использует пользовательские функции платформы Spring 3.1.1 RELEASE

SubdomainMapping.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
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
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
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
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
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;
    }

}



Пример использования:

Мапинг контролера
Код: java
1.
2.
3.
4.
5.
6.
@Controller
@SubdomainMapping(value = "subdomain", tld = ".mydomain.com")
class MyController1 {
    // Code here will be executed only on address match:
    // subdomain.mydomain.com
}



Мапинг метода
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
@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
    }
}



Код: xml
1.
2.
ВАЖНО: До сих пор не удается использовать это решение с элементом XML
<mvc:annotation-driven /> более подробно см. JIRA https://jira.springsource.org/browse/SPR-9344
...
Рейтинг: 0 / 0
17.05.2012, 09:51:11
    #37798242
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC subdomain
griefНе согласен, на уровне веб сервера + сервера имен выполняется регистрация субдомена и парковка оного.
А на уровне приложения производится перехват SubdomainRequestCondition из колекции выглядит приблизительно так...
То есть вместо одной строки в конфиге Apache, проще наваять кучу контроллеров в Java? Удачи с таким подходом!
...
Рейтинг: 0 / 0
17.05.2012, 09:56:20
    #37798251
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC subdomain
Blazkowicz,
+1
поддомен второго уровня.
Часто форумы на домене делают таким макаром.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring MVC subdomain / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]