为什么总是重新创建JSF会话?(在URL中使用双斜杠访问时)

为什么总是重新创建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

我遇到了一个让我头疼的奇怪问题。在重新加载特定页面时,始终会重新创建会话范围的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">
<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;
  }

}