2013-08-04 78 views
0

我的問題是:在每個http請求中,都會創建一個新的會話scoped bean,我不知道爲什麼。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會話在客戶端和服務器之間沒有正確維護,可能會發生這種情況。畢竟,首先仔細閱讀這個答案的「HttpSession」部分:How do servlets work? Instantiation, sessions, shared variables and multithreading,首先了解HTTP會話是如何工作的。

現在,你應該明白,他們默認支持cookies。您現在應該也明白,如果Cookie不是由客戶維護的,或者由於某種原因而被服務器立即銷燬的,那麼會話將不會在請求之間維護。

如果您使用的是內置web開發人員工具集的現代網頁瀏覽器,請按F12顯示並打開「網絡」/「網絡」選項卡。查看Set-Cookie的響應標題和Cookie的後續請求標題。如果Cookie在請求標頭中不存在,因此服務器在響應中返回一個新的Set-Cookie標頭,則表示客戶端不支持cookie。或者,如果存在正確的Cookie標頭,並且服務器在每個響應中仍然返回一個新的Set-Cookie標頭,那麼這意味着服務器的代碼有某行在每個請求上都會調用HttpSession#invalidate()(可能是由啓動程序編寫的本地認證過濾器)。

+0

顯然,Cookie運行良好。 – Jeremie

+0

那麼,HTTP會話是否得到妥善維護?換句話說,'HttpSession#getId()'在同一個瀏覽器會話的請求中每次都返回相同的值? – BalusC

+1

它似乎適用於Chrome而不是Firefox ... – Jeremie

相關問題