我使用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 但是失败了。
答案 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);
}
}