带有Spring MVC的多个域
问题内容:
假设我有一个应用程序,它必须缩短URL,但同时还要做其他事情。(如google.com
和goo.gl
,或facebook.com
和fb.me
)。
简单地部署两个应用程序将很容易,但是(目前)仅一个应用程序会更简单。使用spring和spring-mvc。我有以下映射:
@RequestMapping(value="/{shortUrlKey}", headers="Host=foo.br")
...
@RequestMapping(value="/{username}")
the,headers
注释的作用不是提供更多特定的信息,而是提供限制。因此,如果我有这两个,即使我将其打开为,也只会调用后者http://foo.br/asdf
。如果只保留前者,则对来自的用户有效foo.br
,如果主机不同,则不会打开任何内容。
因此,问题是:
- 如何为相同的路径但URL /主机不同的两个处理程序
- 是否可以使用属性占位符配置器动态解析主机(而不是在批注中对其进行硬编码)
如果存在一些可插拔的方法解析机制,则两者都可能起作用。有吗
问题答案:
我的直接建议是编写一个servlet过滤器(或Spring
HandlerInterceptor
),该过滤器将从请求中获取主机名,将其添加到原始请求的路径之前,然后转发该请求。
例如,给定所请求的URL
http://goo.gl/my/path,过滤器将转发至/goo.gl/my/path
。然后,Spring
MVC映射将有所帮助。蚂蚁风格的通配符语法(例如"**/my/path"
)或路径变量风格(例如,"{requestHost}/my/path"
在此处可能会有所帮助)。
另外,过滤器可以设置包含请求的主机的自定义标头或请求属性,但这可能不太灵活。
不过,我不确定问题第二部分的意思。
这是一个工作片段:
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
if (request.getRequestURL().toString().contains(shortenerDomain)
&& !request.getRequestURI().startsWith(SHORT_URI_PREFIX)) {
request.getRequestDispatcher(SHORT_URI_PREFIX + request.getRequestURI())
.forward(request, response);
return false;
} else {
return true;
}
}