Переопределите getContextPath в HttpServletRequest (для перезаписи URL) - PullRequest
2 голосов
/ 04 ноября 2008

У меня есть веб-приложение, которое я хотел бы расширить для поддержки нескольких языков с новыми URL-адресами. Например, www.example.com/home.do остается английским, а www.example.com/es/home.do - испанским. Моей первой мыслью было создание фильтра, который переписывает входящие URL-адреса, такие как /es/home.do, в /home.do (и устанавливает языковой стандарт в запросе); это отлично работает Фильтр оборачивает ServletRequest с помощью HttpServletRequestWrapper, который переопределяет getContextPath () для возврата языка:

class FakeContextRequest extends HttpServletRequestWrapper {

  private String context = "";
  FakeContextRequest(HttpServletRequest request, String context) {
    super(request);
    // snip some validation code
    this.context = request.getContextPath() + context;
  }
  @Override
  public String getContextPath() {
    return this.context;
  }
}

Мой фильтр перенаправляет на соответствующий запрос следующим образом:

FakeContextRequest fr = new FakeContextRequest(request, lang);
fr.getRequestDispatcher(newResourceName).forward(fr, response);

Моя проблема в том, что следующий сервлет не пересылается должным образом. Следующий сервлет (обычно Struts ActionServlet) перенаправляется в JSP (часто с использованием плиток Struts); когда я добираюсь до JSP, HttpServletRequest несколько раз переносился, и рассматриваемый объект сообщает, что контекст пуст (корневой контекст, в котором фактически развернуто приложение).

Я хочу, чтобы контекст был переписан так, чтобы весь мой контекстно-зависимый код, который уже существует, мог автоматически вставлять язык в написанные URL-адреса. Возможно ли это?

Редактировать: Я решил свою проблему, используя обернутый HttpServletResponse вместо обернутого HttpServletRequest; Я переписываю URL в методе response.encodeURL ().

Ответы [ 3 ]

1 голос
/ 04 ноября 2008

Я не уверен, что переопределения getContextPath() достаточно для решения вашей проблемы. Что если Struts вызывает ServletContext.getContextPath() под прикрытием или использует getRequestURI() и т. Д.?

0 голосов
/ 13 ноября 2008

Я решил свою проблему, переписав URL в response.encodeURL () и друзьях. Объект запроса оборачивается и заменяется по всей цепочке запросов, но объект ответа, кажется, проходит через бездействие. Это работает очень надежно.

0 голосов
/ 04 ноября 2008

Насколько я знаю, обычный способ сделать это - использовать HTTP-заголовок accept-language. Язык презентации - это деталь презентации, которая не должна быть представлена ​​набором URL-адресов для навигации по приложению.

...