簡體   English   中英

JSF為每個請求創建一個新的SessionScoped Bean

[英]JSF creates a new SessionScoped Bean for every request

我的問題是:在每個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而不是其他軟件包,但是我不知道為什么它不起作用...

你對我有什么解決辦法嗎?

如果在客戶端和服務器之間未正確維護HTTP會話,則可能會發生這種情況。 首先,請仔細閱讀以下答案的“ HttpSession”部分,以首先了解HTTP會話的工作方式: servlet如何工作? 實例化,會話,共享變量和多線程

現在,您應該了解默認情況下它們由Cookie支持。 您現在還應該了解,如果由於某種原因客戶端未維護cookie或服務器立即破壞了cookie,則不會在請求之間維護會話。

如果您使用的是帶有內置Web開發人員工具集的現代Web瀏覽器,請按F12鍵顯示它並打開“網絡” /“網絡”選項卡。 在響應標頭中查找Set-Cookie ,在后續請求標頭中查找Cookie 如果請求標頭中不存在Cookie則服務器在響應上返回新的Set-Cookie標頭,則意味着客戶端不支持Cookie。 或者,如果存在正確的Cookie標頭,並且服務器仍在每個響應上返回新的Set-Cookie標頭,則意味着服務器的代碼中某行在每個請求上調用HttpSession#invalidate() (也許是本地認證過濾器)由入門者編寫)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM