Несколько доменов с 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-адреса/хосты
- Можно ли разрешить хост динамически, с конфигуратором заполнителя свойств (а не жестким кодом в аннотации).
Возможно, оба будут работать, если есть какой-либо подключаемый механизм для разрешения метода. Есть ли такие?
Ответы
Ответ 1
Моим непосредственным предложением было бы написать фильтр сервлета (или Spring HandlerInterceptor
), который взял бы имя хоста из запроса, добавит его к исходному запрошенному пути, а затем переадресует запрос.
Например, с учетом запрошенного URL http://goo.gl/my/path фильтр перейдет на /goo.gl/my/path
. Сопоставлениям Spring MVC было бы что-то, чтобы получить свои зубы. Синтаксис подстановочного символа 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;
}
}
Ответ 2
Основываясь на вашем описании, это звучит так, будто у вас может быть два метода контроллера с каждым отображением заголовка домена:
@RequestMapping(value="/{shortUrlKey}", headers="Host=foo.br")
public void fooBr() { ... }
@RequestMapping(value="/{shortUrlKey}", headers="Host=bar.bz")
public void barBz() { ... }