0

我正在使用Spring + Gradle + PostgreSQL,我想写一个新的Spring ServletDispatcher或HandlerMapping(我不知道哪个是最好的选择)。

要求是:根据子域名将HTTP请求重定向到不同的控制器。

例如:

HTTP 请求到:
aaa.domain.com 将被重定向到 =>websites/aaa/
bbb.domain.com =>websites/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')

非常感谢!

第一次更新

我对 Spring 进行了更深入的研究。现在我认为新的 HandlerMapping 可能是更好的选择。所以我想重写DefaultAnnotationHandlerMapping

它是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 来定义我的项目。

我试图在application.properties中定义org.springframework.web.servlet.HandlerMapping但失败了。

4

1 回答 1

2

您可以拦截请求并获取子域,然后将其转发到您想要的路径。

为此,您可以实现 aHandlerInterceptor或扩展。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);
    }
}
于 2017-10-05T10:13:05.763 回答