我们应该在正常的JSF会话中找到什么?

时间:2015-02-18 15:03:45

标签: jsf session

我今天刚刚注意到会话地图包含的不仅仅是我投入的内容。

Map<String, Object> sessionMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
Iterator attributeNames = sessionMap.keySet().iterator(); 
while ( attributeNames.hasNext() ){
  System.out.println(attributeNames.next().toString());
}

我在会话中发现了两个未知对象:com.sun.faces.application.view.activeViewMapsjavax.faces.request.charset。在会话中找到这些对象是正常的吗?

我问这个是因为com.sun.faces.application.view.activeViewMaps在服务器重启时给出了序列化错误。看起来它似乎试图序列化几乎所有东西。

注意:我知道我可以通过取消注释服务器<Manager pathname="" />文件中的context.xml来关闭序列化。我只是想知道在会话中找到com.sun.faces.application.view.activeViewMaps是否正常。

1 个答案:

答案 0 :(得分:7)

是的,在会话中找到两者是正常的:

<强> com.sun.faces.application.view.activeViewMaps

从JSF 2.2.0开始,com.sun.faces.application.view.ViewScopeContextManager处理CDI @ViewScoped bean,并将活动视图映射存储在会话中,ACTIVE_VIEW_MAPS作为密钥(ACTIVE_VIEW_MAPS是一个常量字段,其值为"com.sun.faces.application.view.activeViewMaps"),以便跟踪它们。

当会话被销毁时,它们也会被销毁,您可以从grepcode.com检查sessionDestroyed(HttpSessionEvent hse)的源代码。

<强> javax.faces.request.charset:

在JSF文档中,您可以找到有关public String calculateCharacterEncoding(FacesContext context)的方法ViewHandler的信息:

  

返回用于此请求的正确字符编码。

     

采用以下算法。

     
      
  • 检查Content-Type请求标头。如果它有一个charset参数,请将其解压缩并将其作为编码返回。
  •   
  • 如果未找到charset参数,请检查是否存在   通过调用ExternalContext.getSession(boolean)来传递false会话   作为论点。如果该方法返回true,请获取会话Map by   调用ExternalContext.getSessionMap()并查找下的值   由符号常量的值给出的键   CHARACTER_ENCODING_KEY。如果存在,则返回转换为的值   字符串。
  •   
  • 否则,返回null
  •   

虽然CHARACTER_ENCODING_KEY是一个常数字段:

  

会话的属性集中的键,响应在其下   可以存储和检索字符编码。

您可以从here获取价值,即:"javax.faces.request.charset"