2013-08-04 50 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

相关问题