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

For*_*esR 4 session jsf

我今天刚才注意到会话地图包含的内容比我输入的要多.

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

我在会话中发现了两个未知对象: 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在会话中找到是否正常.

Tar*_*rik 7

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

com.sun.faces.application.view.activeViewMaps:

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

当会话被破坏时,它们也将被销毁,您可以sessionDestroyed(HttpSessionEvent hse)grepcode.com查看源代码.

javax.faces.request.charset:

在JSF的文档,你可以关于方法发现public String calculateCharacterEncoding(FacesContext context)ViewHandler,即:

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

采用以下算法.

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

虽然CHARACTER_ENCODING_KEY是一个恒定的领域:

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

你可以从这里得到它的价值,即:"javax.faces.request.charset"