我的问题是:在每个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而不是其他包但我不知道它为什么不起作用...
你有解决方案吗?
答案 0 :(得分:3)
如果在客户端和服务器之间未正确维护HTTP会话,则可能发生这种情况。在此之前,请先仔细阅读本答案的“HttpSession”部分,了解HTTP会话的工作原理:How do servlets work? Instantiation, sessions, shared variables and multithreading。
现在,您应该了解它们默认由Cookie支持。您现在还应该了解,如果客户端未维护cookie或由于某种原因服务器立即销毁cookie,则不会跨请求维护会话。
如果您使用内置Web开发人员工具集的现代webbrowser,请按F12显示它并打开“Net”/“Network”选项卡。查看Set-Cookie
的响应标头以及Cookie
的后续请求标头。如果请求标头中不存在Cookie
,因此服务器在响应上返回新的Set-Cookie
标头,则表示客户端不支持cookie。或者,如果存在正确的Cookie
标头,并且服务器仍然在每个响应上返回一个新的Set-Cookie
标头,那么这意味着服务器的代码在每个请求上都有一行调用HttpSession#invalidate()
的行(也许是一个由初学者编写的本土认证过滤器。)