为什么总是重新创建JSF会话?(在URL中使用双斜杠访问时)
我遇到了一个让我头疼的奇怪问题。在重新加载特定页面时,始终会重新创建会话范围的bean。bean会丢失所有信息,会话id总是新的。哎呀,这是一种反常的行为 我想我已经用以下代码重现了这个问题: sessionTest.xhtml为什么总是重新创建JSF会话?(在URL中使用双斜杠访问时),jsf,session,jsf-2,Jsf,Session,Jsf 2,我遇到了一个让我头疼的奇怪问题。在重新加载特定页面时,始终会重新创建会话范围的bean。bean会丢失所有信息,会话id总是新的。哎呀,这是一种反常的行为 我想我已经用以下代码重现了这个问题: sessionTest.xhtml <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <htm
<!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">
<h:body>
<!-- Fake call to initSession to force creating the bean -->
<h:outputText value="#{sessionTestC.initSession()}"></h:outputText>
<h:outputText value="#{sessionTestC.sessionId}"></h:outputText>
</h:body>
</html>
每次重新加载sessionTest.xhtml
页面时,我都会得到一个新的会话Id。在控制台中,我可以看到:creating sessionTestC!|初始会话…|创建sessionTestC!|初始化会话
显然我做错了什么,但我找不到什么。我使用的是JSF2.1.19。如评论会话中所述,作用域bean工作得非常好
问题是端口
后的URL中出现了双斜杠http://localhost:8080//TestBean/sessionTest.xhtml
。出于某种原因,所有流行的浏览器(FF、IE、Chrome)都不会为这样的URL发送cookie。因为JSESSIONID
cookie没有发送到服务器,所以服务器会创建一个新的会话。我在JBoss 7.1.1上运行您的示例,一切正常-bean初始化一次,会话id对于所有后续请求都是相同的。您是否尝试过更新版本的JSF库?您能提供更多关于您所使用环境的详细信息吗?@DawidBytel如果我没有回复,很抱歉。你的评论让我意识到这段代码很好,还有其他的东西。我想我发现了问题:如果我调用http://localhost:8080/TestBean/sessionTest.xhtml
一切正常,但如果我打电话给http://localhost:8080//TestBean/sessionTest.xhtml
(注意端口后面的双/
),然后根据请求创建bean!有什么原因吗?
package myapp.beans.controller;
import java.io.Serializable;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;
@SessionScoped
@ManagedBean(name="sessionTestC")
public class SessionTestController implements Serializable {
/**
*
*/
private static final long serialVersionUID = -6024842251492695682L;
private String sessionId = null;
@PostConstruct
public void reset () {
System.out.println("creating sessionTestC!");
}
@PreDestroy
public void destroy () {
System.out.println("destroying sessionTestC!");
}
public void initSession() {
System.out.println("Init session...");
FacesContext fCtx = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) fCtx.getExternalContext().getSession(false);
sessionId = session.getId();
}
public String getSessionId() {
FacesContext fCtx = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) fCtx.getExternalContext().getSession(false);
sessionId = session.getId();
return sessionId;
}
public void setSessionId(String sessionId) {
this.sessionId = sessionId;
}
}