Новый запрос перенаправления 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);
}
}