0

我的问题是:在每个 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>

这是我的 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 而不是其他包,但我不知道为什么它不起作用......

你有什么解决办法吗?

4

1 回答 1

3

如果客户端和服务器之间没有正确维护 HTTP 会话,则可能会发生这种情况。首先,通过仔细阅读此答案的“HttpSession”部分来了解 HTTP 会话的工作原理:Servlet 如何工作?实例化、会话、共享变量和多线程

现在,您应该了解它们默认由 cookie 支持。您现在还应该了解,如果 cookie 没有由客户端维护或由于某种原因被服务器立即销毁,则不会跨请求维护会话。

如果您使用的是带有内置网络开发工具集的现代网络浏览器,请按 F12 显示它并打开“网络”/“网络”选项卡。在响应标Set-Cookie头中查找Cookie. 如果Cookie请求标头中不存在,因此服务器Set-Cookie在响应中返回一个新标头,则意味着客户端不支持 cookie。或者如果存在正确的Cookie标头并且服务器仍然Set-Cookie在每个响应上返回一个新标头,那么这意味着服务器的代码在某处有一行调用HttpSession#invalidate()每个请求(可能是由启动器编写的本地认证过滤器)。

于 2013-08-04T12:46:27.887 回答