проблемы с получением сеанса из ServletRequest в фильтре - PullRequest
0 голосов
/ 16 июня 2019

Моя цель состоит в том, чтобы перехватить ServletResponse с помощью фильтра и добавить некоторый пользовательский html к нему, прежде чем он появится на веб-странице. Я также хочу сделать некоторые вычисления и добавить результаты в переменную сеанса HashMap, к которой я смогу получить доступ при последующем вызове.

Я не могу понять, как получить сеанс из ServletRequest внутри метода doFilter. Вот мой код:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {    
    CountingServletResponse counter = null;
    try {           
        HttpServletResponse httpResp = (HttpServletResponse) response;
        counter = new CountingServletResponse(httpResp);
        counter.addHeader("UniqueId", String.valueOf(counter.getUniqueId()));
        HttpServletRequest httpReq = (HttpServletRequest) request;
        HttpSession session = httpReq.getSession(); //this throws error
        //I want to add session variable here
        chain.doFilter(request, response);
        counter.flushBuffer(); // Push the last bits containing HTML comment.   
    } catch (Throwable t) {
        t.printStackTrace();
    }
}

Строка с getSession throws

java.lang.IllegalStateException: невозможно создать сеанс после ответ был принят

и если я получаю getSession (false), то он проходит через эту строку, но session == null, и я не могу добавить переменные сеанса. Идеи?

1 Ответ

0 голосов
/ 16 июня 2019

getSession() пытается получить текущий сеанс, и, если он не существует, он пытается создать новый. getSession(false) также пытается получить сеанс, но если он не существует, он возвращает ноль (кстати, это означает, что getSession() === getSession(true)). Вот почему с getSession() у вас есть исключение (потому что вы не можете его создать), а с getSession(false) у вас есть null, потому что нет сеанса и нет попытки создать новый.

Поскольку вы уже отправляете ответ клиенту, вы не можете добавить к нему новые http-заголовки, в этот момент уже слишком поздно. Не знаю, каково ваше окружение, но вам нужно быстрее поработать.

...