2013-08-04 4 views
0

Моя проблема в том, что один: при каждом HTTP-запросе создается новый бонусный сеанс, и я не знаю почему.JSF создает новый SessionScoped Bean для каждого запроса

Вот мой JSF индекс страницы:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:ui="http://java.sun.com/jsf/facelets" 
     xmlns:p="http://primefaces.org/ui"> 

<h:head> 
    <link type="text/css" rel="stylesheet" href="css/default.css"/> 
</h:head> 
<h:body> 

    <p:growl autoUpdate="true" showDetail="true" globalOnly="true"/> 

    <h:form id="f_main"> 

     <ui:include src="#{pageBean.page}.xhtml"/> 

    </h:form> 

</h:body> 
</html> 

Вот мой PageBean

package web.bean.system; 

import org.apache.log4j.Logger; 
import web.bean.AbstractBean; 

import javax.faces.bean.ManagedBean; 
import javax.faces.bean.SessionScoped; 

@ManagedBean 
@SessionScoped 
public class PageBean extends AbstractBean { 
    private static final long serialVersionUID = -882977117976414497L; 
    private static final Logger LOG = Logger.getLogger(PageBean.class); 
    public static final String HOME = "home"; 
    private static int IT = 0; 

    private String page; 

    public PageBean() { 
     LOG.debug(IT++); 
     this.page = HOME; 
    } 

    public String getPage() { 
     LOG.debug(page); 
     return this.page; 
    } 

    public void setPage(String page) { 
     LOG.debug(page); 
     this.page = page; 
    } 
} 

В этом случае, домашняя страница пуста.

Но когда я просматриваю журналы после многократного обновления, я вижу, что для каждого HTTP-запроса создается новый bean-компонент.

Я проверил, что я действительно использовать javax.faces.bean, а не другой пакет, но я не знаю, почему это не работает ...

Имеет ли вы решение для меня?

+0

Попробуйте переместить код из конструктора в метод 'init', аннотированный' @ PostConstruct'. Разве это имеет значение? – Manuel

+0

Первоначально я так делал, но это не сработало – Jeremie

ответ

2

Это может произойти, если HTTP-сеанс не поддерживается должным образом между клиентом и сервером. Прежде всего, сначала узнайте, как работают сеансы HTTP, тщательно прочитав раздел «HttpSession» этого ответа: How do servlets work? Instantiation, sessions, shared variables and multithreading.

Теперь вы должны понимать, что по умолчанию они поддерживаются куки-файлами. Вы также должны понимать, что если cookie не поддерживается клиентом или мгновенно уничтожается сервером по какой-либо причине, то сеанс не поддерживается между запросами.

Если вы используете немного современного веб-браузера со встроенным набором инструментов для веб-разработчиков, нажмите F12, чтобы отобразить его и открыть вкладку «Сеть»/«Сеть». Просмотрите заголовок ответа для Set-Cookie и в следующем заголовке запроса для Cookie. Если Cookie отсутствует в заголовке запроса, и, таким образом, сервер возвращает новый заголовок Set-Cookie в ответ, то это означает, что клиент не поддерживает файлы cookie. Или, если присутствует правильный заголовок Cookie, и сервер по-прежнему возвращает новый заголовок Set-Cookie для каждого ответа, то это означает, что код сервера имеет строку, которая вызывает по каждому запросу HttpSession#invalidate() (возможно, фильтр подлинности доморощенного аутентификации, который записывается стартером).

+0

Видимо, файлы cookie работают хорошо. – Jeremie

+0

Итак, HTTP-сессия правильно поддерживается? Другими словами, 'HttpSession # getId()' возвращает одно и то же значение каждый раз по запросам в том же сеансе браузера? – BalusC

+1

Кажется, что работает на хроме, но не на Firefox ... – Jeremie

Смежные вопросы