Подтвердить что ты не робот

Несколько доменов с 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-адреса/хосты
  • Можно ли разрешить хост динамически, с конфигуратором заполнителя свойств (а не жестким кодом в аннотации).

Возможно, оба будут работать, если есть какой-либо подключаемый механизм для разрешения метода. Есть ли такие?

4b9b3361

Ответ 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() { ... }