具有spring mvc的多个域

Boz*_*zho 18 java spring spring-mvc

假设我有一个应用程序必须缩短URL,但也做其他事情.(喜欢google.comgoo.gl,或者facebook.comfb.me).

简单地部署两个应用程序很容易,但(现在)只需一个就可以了.使用弹簧和弹簧mvc.我有以下映射:

@RequestMapping(value="/{shortUrlKey}", headers="Host=foo.br")
...
@RequestMapping(value="/{username}")
Run Code Online (Sandbox Code Playgroud)

唉,headers注释不是提供更具体的信息,而是提供限制.所以,如果我有这两个,只有后者被调用,即使我打开它http://foo.br/asdf.如果只留下前者,它适用于来自的人foo.br,如果主人不同,则不会打开任何东西.

所以,问题:

  • 如何为相同的路径创建两个处理程序,但不同的URL /主机
  • 是否可以使用属性占位符配置器动态解析主机(而不是在注释中对其进行硬编码)

如果有一些可插拔的方法解决机制,也许两者都可以工作.有这样的吗?

ska*_*man 15

我的直接建议是编写一个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;
    }
}
Run Code Online (Sandbox Code Playgroud)