基于域名的新Spring ServletDispatcher / HandlerMapping重定向请求

时间:2017-10-05 02:30:28

标签: spring spring-mvc servlet-dispatching

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

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

例如:

HTTP请求:
aaa.domain.com将重定向到=>网站/ AAA /
bbb.domain.com =>网站/ BBB /

我怎么写呢?

My Gradle依赖项:

{
  "Accounts": [
    ***"<SOMETHING_FROM_DATABASE>"***: {
      "Rules": [
        ***"<SOMETHING_FROM_DATABASE>"***:{
          "Compliant":[],
          "Non-Complaint":[],
          "INSUFFICIENT_DATA":[]
        }
      ]
    }
  ]
}

非常感谢!

首次更新

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

它是一类包 spring-webmvc ,并在 DispatcherServlet.properties 中定义如下:

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')

我无法直接更改 DispatcherServlet.properties 。所以如果我想用我的班级替换班级,我怎么能这样做呢?

我使用了很多spring-boot-starter而不是XML来定义我的项目。

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

1 个答案:

答案 0 :(得分:2)

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

您可以为此目的实施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);
    }
}