@Biaci_Anj

Сервлеты, меняется язык только со второго нажатия по ссылке, почему?

Помогите, пожалуйста, с интернализацией в сервлетах через куки.

Вот так я добавил на страницу бандл
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<fmt:setLocale value="${cookie['lang'].value}"/>
<fmt:setBundle basename="messages"/>

Вот фильтр, который добавляет кукис lang в response

@WebFilter("/*")
public class CookieLocaleFilter implements Filter  {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;

        if (req.getParameter("locale") != null) {
            Cookie cookie = new Cookie("lang", req.getParameter("locale"));
            res.addCookie(cookie);
        }

        chain.doFilter(request, response);
    }
}


Вот так вот я меняю язык
<li><a href="?locale=en"><fmt:message key="label.lang.en" /></a></li>
<li><a href="?locale=ua"><fmt:message key="label.lang.ua" /></a></li>

Проблема в том, что язык меняется только со второго нажатия по ссылке.
Первый раз - добавляется куки в браузер, но на странице ничего не происходит и

не меняет значение абсолютно. На второе нажатие по ссылке - уже меняется язык.
Что я делаю не так?

P.S.
Объясняю подробнее:
Допустим, я перехожу по ссылке ?locale=ua.
<c:out value="${cookie['lang'].value}"/>
Выводит en, первое нажатие - ничего ( только куки в браузере появились ), второе нажатие - поменялся вывод на ua
Такое чувство, что куки читаются только со второго перехода на страницу. Или страница загружается как-то раньше обновлений куки.
  • Вопрос задан
  • 57 просмотров
Решения вопроса 1
@Akela_wolf
Extreme Programmer
Ну так вы полностью правы. Как работает Cookie.
  1. Сервер отсылает заголовок Set-Cookie браузеру
  2. Вместе с заголовком сервер отсылает страницу.
  3. Получив заголовок Set-Cookie браузер сохраняет "печеньку" у себя.
  4. При следующем запросе страницы с этого сайта браузер к запросу присоединяет заголовок Cookie, в котором передает сохраненные "печеньки".
  5. В ответе сервер снова может прислать Set-Cookie, тогда будет добавлена или обновлена имеющаяся "печенька".

Таким образом, в вашем случае достаточно не переходить по ссылке еще раз, а нажать F5 - язык переключится.

Вообще, для решения вашей проблемы я бы брал язык из URL и только если его там нет - из "печеньки". Тогда переход на страницу с нужным языком переключал бы его сразу (так как значение в URL имеет приоритет) и сохранял в cookie для последующих запросов.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы