具有spring mvc的多个域
假设我有一个应用程序必须缩短URL,但也做其他事情。 (例如google.com
和goo.gl
,或facebook.com
和fb.me
)。
简单地部署两个应用程序很容易,但(现在)只需一个就可以了。 使用spring和spring-mvc。 我有以下映射:
@RequestMapping(value="/{shortUrlKey}", headers="Host=foo.br") ... @RequestMapping(value="/{username}")
唉, headers
注释不是提供更具体的信息,而是作为限制。 所以如果我有这两个,只有后者被调用,即使我打开它作为http://foo.br/asdf
。 如果只留下前者,它适用于那些来自foo.br
,并且如果主机不同则不会打开任何东西。
那么,问题:
- 如何为相同的路径创建两个处理程序,但不同的URL /主机
- 是否可以使用属性占位符配置器动态解析主机(而不是在注释中对其进行硬编码)
如果有一些可插拔的方法解析机制,也许两者都可行。 有这样的吗?
我的直接建议是编写一个servletfilter(或Spring HandlerInterceptor
),它将从请求中获取主机名,将其添加到原始请求的路径,然后转发请求。
例如,根据请求的URL http://goo.gl/my/path ,filter将转发到/goo.gl/my/path
。 然后,Spring MVC映射就可以获得一些东西。 ant样式的通配符语法(例如"**/my/path"
)或路径变量样式(例如"{requestHost}/my/path"
在那里可能会有所帮助。
或者,filter可以设置包含所请求主机的自定义标头或请求属性,但这可能不太灵活。
不过,我不确定你的问题的第二部分是什么意思。
这是一个工作片段:
@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; } }
根据您的描述,听起来您可以在每个域头映射中使用两个控制器方法:
@RequestMapping(value="/{shortUrlKey}", headers="Host=foo.br") public void fooBr() { ... } @RequestMapping(value="/{shortUrlKey}", headers="Host=bar.bz") public void barBz() { ... }