我今天刚刚注意到会话地图包含的不仅仅是我投入的内容。
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.activeViewMaps
和javax.faces.request.charset
。在会话中找到这些对象是正常的吗?
我问这个是因为com.sun.faces.application.view.activeViewMaps
在服务器重启时给出了序列化错误。看起来它似乎试图序列化几乎所有东西。
注意:我知道我可以通过取消注释服务器<Manager pathname="" />
文件中的context.xml
来关闭序列化。我只是想知道在会话中找到com.sun.faces.application.view.activeViewMaps
是否正常。
答案 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"