Новый запрос перенаправления Spring ServletDispatcher/ HandlerMapping на основе доменного имени

Я использую Spring + Gradle + PostgreSQL, и я хочу написать новый Spring ServletDispatcher или HandlerMapping (я не знаю, какой из них является лучшим выбором).

Требование: перенаправить HTTP-запрос на другой контроллер в соответствии с его именем субдомена.

Например:

HTTP-запрос к:
aaa.domain.com будет перенаправлен на => сайты / ааа /
bbb.domain.com => сайты /bbb/

Как я мог написать это?

Мои зависимости Gradle:

compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile('org.springframework.boot:spring-boot-starter-thymeleaf')
compile('org.springframework.boot:spring-boot-starter-web')
compile('org.springframework.boot:spring-boot-starter-aop')
compile('org.springframework.boot:spring-boot-starter-data-rest')
compile('org.springframework.boot:spring-boot-starter-jdbc')
compile('org.springframework.boot:spring-boot-starter-web-services')
compile('org.springframework.boot:spring-boot-starter-websocket')
runtime('org.postgresql:postgresql')
testCompile('org.springframework.boot:spring-boot-starter-test')

Спасибо большое!

Первое обновление

Я исследовал весну немного глубже. И теперь я думаю, что новый HandlerMapping может быть лучшим выбором. Поэтому я хочу переписать DefaultAnnotationHandlerMapping.

Это класс package spring-webmvc, который определен в DispatcherServlet.properties следующим образом:

org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping

Я не могу изменить DispatcherServlet.properties напрямую. Так что, если я хочу заменить класс своим классом, как я могу это сделать?

Я использовал много Spring-Boot-Starter вместо XML, чтобы определить мой проект.

Я попытался определить org.springframework.web.servlet.HandlerMapping в application.properties, но не смог.

1 ответ

Вы можете перехватить запрос и получить поддомен, а затем переслать его по желаемому пути.

Вы можете реализовать HandlerInterceptor или продлить HandlerInterceptorAdapter для этого. Вот пример, который получает поддомен и перенаправляет:

@Component
public class DomainHandlerInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, 
                             HttpServletResponse response, Object o) throws Exception {
        String subDomain = request.getServerName().split("\\.")[0];
        if (request.getAttribute("domainHandled") != null) {
            request.setAttribute("domainHandled", true);
            request.getRequestDispatcher("/websites/" + subDomain)
                    .forward(request, response);
            System.out.println(request.getRequestURL().toString());
            return false;
        }

        return true;
    }
}

Добавить DomainInterceptor в реестр перехватчиков:

@Configuration
public class AppConfig extends WebMvcConfigurerAdapter {

    @Autowired 
    HandlerInterceptor domainHandlerInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(domainHandlerInterceptor);
    }
}
Другие вопросы по тегам