У меня есть веб-приложение, которое я хотел бы расширить для поддержки нескольких языков с новыми 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 Tiles); когда я перехожу к JSP, HttpServletRequest был обернут несколько раз, и рассматриваемый объект сообщает, что контекст пуст (корневой контекст, в котором фактически развертывается приложение).
Я хочу, чтобы контекст был переписан, чтобы весь мой контекстно-зависимый код, который уже существует, мог автоматически вставлять язык в написанные URL-адреса. Это возможно?
Редактировать: Я решил свою проблему, используя обернутый HttpServletResponse вместо обернутого HttpServletRequest; Я переписываю URL-адрес в методе response.encodeURL ().




Насколько мне известно, обычный способ сделать это - использовать HTTP-заголовок на принимаемом языке. Язык презентации - это деталь презентации, которая не должна быть представлена набором URL-адресов для навигации по приложению.
Я не уверен, что переопределения getContextPath() достаточно для решения вашей проблемы. Что, если Struts незаметно вызывает ServletContext.getContextPath() или использует getRequestURI() и т. д.?
Я решил свою проблему, выполнив перезапись URL в response.encodeURL () и друзьях. Объект запроса оборачивается и заменяется по всей цепочке запросов, но объект ответа, похоже, не подвергается воздействию. Это работает очень надежно.
Я думаю, что это метод, используемый в проекте UrlRewriterFilter tuckey.org/urlrewrite
Заголовок accept-language не будет работать, потому что он несовместим с поисковыми системами. Поисковым системам нужны уникальные ссылки, чтобы распространять контент на разных языках.