У меня есть веб-приложение, которое я хотел бы расширить для поддержки нескольких языков с новыми 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 ().