JSF为每个请求创建一个新的SessionScoped Bean

JSF为每个请求创建一个新的SessionScoped Bean,jsf,primefaces,Jsf,Primefaces,我的问题是:在每个http请求中,都会创建一个新的会话范围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请求中,都会创建一个新的会话范围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>
在这种情况下,主页是空的

但是当我在刷新了很多时间之后查看日志时,我可以看到为每个http请求创建了一个新的bean

我已经验证了我确实使用javax.faces.bean而不是其他包,但我不知道为什么它不起作用


您有什么解决方案吗?

如果客户端和服务器之间的HTTP会话没有正确维护,可能会发生这种情况。首先,请仔细阅读以下答案的“HttpSession”部分,了解HTTP会话的工作原理:

现在,您应该明白,默认情况下,它们是由cookie支持的。您现在还应该了解,如果客户端没有维护cookie,或者由于某种原因服务器没有立即销毁cookie,那么会话将不会跨请求进行维护


如果您正在使用带有内置web developer工具集的有点现代的webbrowser,请按F12将其显示出来,然后打开“网络”/“网络”选项卡。在响应头中查找
设置Cookie
,在后续请求头中查找
Cookie
。如果请求标头中缺少
Cookie
,因此服务器在响应上返回新的
Set Cookie
标头,则表示客户端不支持Cookie。或者,如果存在正确的
Cookie
头,并且服务器仍然在每个响应上返回一个新的
Set Cookie
头,那么这意味着服务器的代码在某个地方有一行,在每个请求上调用
HttpSession#invalidate().

如果客户端和服务器之间的HTTP会话未正确维护,则可能发生这种情况。首先,请仔细阅读以下答案的“HttpSession”部分,了解HTTP会话的工作原理:

现在,您应该明白,默认情况下,它们是由cookie支持的。您现在还应该了解,如果客户端没有维护cookie,或者由于某种原因服务器没有立即销毁cookie,那么会话将不会跨请求进行维护


如果您正在使用带有内置web developer工具集的有点现代的webbrowser,请按F12将其显示出来,然后打开“网络”/“网络”选项卡。在响应头中查找
设置Cookie
,在后续请求头中查找
Cookie
。如果请求标头中缺少
Cookie
,因此服务器在响应上返回新的
Set Cookie
标头,则表示客户端不支持Cookie。或者,如果存在正确的
Cookie
头,并且服务器仍然在每个响应上返回一个新的
Set Cookie
头,那么这意味着服务器的代码在某个地方有一行,在每个请求上调用
HttpSession#invalidate().

尝试将代码从构造函数移动到
init
方法中,并用
@PostConstruct
注释。它有什么区别吗?最初我是这样做的,但它没有起作用。我尝试将代码从构造函数移动到
init
方法中,并用
@PostConstruct
注释。这有什么区别吗?最初我是这样做的,但它没有工作,HTTP会话得到了正确的维护?换句话说,
HttpSession#getId()
每次在同一浏览器会话上的请求之间返回相同的值?那么,HTTP会话是否得到了正确维护?换句话说,
HttpSession#getId()
每次在同一浏览器会话上的请求中返回相同的值?
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;
    }
}