Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用spring mvc的多个域_Java_Spring_Spring Mvc - Fatal编程技术网

Java 使用spring mvc的多个域

Java 使用spring mvc的多个域,java,spring,spring-mvc,Java,Spring,Spring Mvc,假设我有一个应用程序,它必须缩短URL,但也要做其他事情。(如google.com和goo.gl,或facebook.com和fb.me) 简单地部署两个应用程序将很容易,但(目前)只部署一个应用程序更简单。使用spring和SpringMVC。我有以下映射: @RequestMapping(value="/{shortUrlKey}", headers="Host=foo.br") ... @RequestMapping(value="/{username}") 唉,标题注释的作用不是提供更

假设我有一个应用程序,它必须缩短URL,但也要做其他事情。(如
google.com
goo.gl
,或
facebook.com
fb.me

简单地部署两个应用程序将很容易,但(目前)只部署一个应用程序更简单。使用spring和SpringMVC。我有以下映射:

@RequestMapping(value="/{shortUrlKey}", headers="Host=foo.br")
...
@RequestMapping(value="/{username}")
唉,
标题
注释的作用不是提供更具体的信息,而是限制。因此,如果我有这两个,即使我以
http://foo.br/asdf
。如果只保留前者,则它适用于来自
foo.br
的用户,如果主机不同,则不会打开任何内容

因此,问题是:

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

如果有某种方法解析的可插拔机制,也许这两种方法都可以工作。是否存在这种情况?

我的直接建议是编写一个servlet过滤器(或Spring
HandlerInterceptor
),它将从请求中获取主机名,将其前置到原始请求路径,然后在请求中转发

例如,给定请求的URL,过滤器将转发到
/goo.gl/my/path
。然后,SpringMVC映射将有一些东西需要深入研究。ant样式的通配符语法(例如,
“***/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;
    }
}

根据您的描述,听起来您可能有两个控制器方法,每个域头映射:

@RequestMapping(value="/{shortUrlKey}", headers="Host=foo.br")
public void fooBr() { ... }

@RequestMapping(value="/{shortUrlKey}", headers="Host=bar.bz")
public void barBz() { ... }

好主意:)第二个问题是关于配置短主机名,而不是硬编码。但是你的建议也解决了这个问题(我将在拦截器中注入一个
@Value
)。将给它一个尝试,然后接受答案:)添加了一个代码段。(它可以使用getHeader(“主机”),但没有什么区别)我想,是的,它可能会工作(因此+1),但这意味着硬编码我的主机,这不是很好:)spring mvc支持请求映射注释中的占位符,这也可以在headers属性上工作