我用容器管理的安全性编写了简单的应用程序.问题是当我登录并打开另一个我注销的页面时,然后我回到第一页,我点击任何链接等或刷新页面我得到这个例外.我想这是正常的(或者可能不是:))因为我退出了会话被破坏了.我该怎么做才能将用户重定向到例如index.xhtml或login.xhtml,并使他免于看到错误页面/消息?
换句话说,如何在我退出后自动将其他页面重定向到索引/登录页面?
这里是:
javax.faces.application.ViewExpiredException: viewId:/index.xhtml - View /index.xhtml could not be restored.
at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:212)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:110)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215)
at filter.HttpHttpsFilter.doFilter(HttpHttpsFilter.java:66)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:277)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97)
at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165)
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791)
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693)
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954)
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170)
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88)
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76)
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)
at com.sun.grizzly.ContextTask.run(ContextTask.java:69)
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330)
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309)
at java.lang.Thread.run(Thread.java:619)
Run Code Online (Sandbox Code Playgroud) 直到在什么时间点不JSF UI保存组件的状态在服务器端和什么时候被删除的UI组件的状态信息从服务器内存?当应用程序中的登录用户浏览页面时,组件的状态是否会继续在服务器上累积?
我不明白在服务器上保持UI组件状态有什么好处?是不是直接将经过验证/转换的数据传递给托管bean?我可以或者应该尽量避免它吗?
如果有数千个并发用户会话,那么在服务器端是否会消耗太多内存?我有一个应用程序,用户可以在某些主题上发布博客.这个博客的规模非常大.当有回复或请求查看博客时,这些大页面数据是否会被保存为组件状态的一部分? 这会耗费太多记忆.这不是一个问题吗?
现在,在使用JSF时不再需要保存状态.可以使用高性能无状态JSF实现.有关详细信息和讨论,请参阅此博客和此问题.此外,JSF规范中还包含一个未解决的问题,即为JSF提供无状态模式的选项.(PS考虑的问题投票这个和这个,如果这对你是一个非常有用的功能.)
一个好消息,Mojarra 2.1.19是无状态模式!
看这里:
http://weblogs.java.net/blog/mriem/archive/2013/02/08/jsf-going-stateless?force=255
我正在学习JSF,当我意识到每当我们使用时<h:form>,JSF的标准行为总是向我显示浏览器中上一页的URL ,而不是当前页面的URL,我感到非常惊讶和困惑.
我知道这与JSF总是将表单发布到同一页面的方式有关,然后只是呈现控制器将其返回给浏览器的任何页面,而浏览器不知道页面位置已更改.
似乎JSF已经存在了足够长的时间,必须有一个干净,可靠的方法来处理这个问题.如果是这样,你介意分享吗?
我找到了各种解决方法,但遗憾的是,这似乎不是一个真正可靠的解决方案.
"?faces-redirect=true"到每个 bean的操作的返回值然后
@RequestScoped用其他东西替换(Flash Scopes,CDI对话,@ SessionScoped,......).如果它"?faces-redirect=true"是如此好,有没有办法配置整个应用程序以这种方式处理所有请求?
我正在展示非常敏感的数据.用户从我的服务器注销后,我不希望其他用户能够看到数据点击浏览器的"后退"按钮.
我怎样才能做到这一点?
每个会话的内存增长
使用JSF 2.2(2.2.12)和Mojarra,我们正在经历高内存消耗.在研究了我们的负载测试之后,我们发现ViewScoped Beans中的数据大小非常高(有时超过1MB).无论如何 - 当从视图导航到视图时,会话内存大小会增长和增长.我们不能在短期内减少bean的大小,因此这种行为会产生相当大的影响.
解决方案1 - 更改上下文参数(不工作)
现在 - 我们使用了Mojarra的官方上下文参数,默认情况下设置为15:
com.sun.faces.numberOfLogicalViews
com.sun.faces.numberOfViewsInSession
Run Code Online (Sandbox Code Playgroud)
将这些参数更改为较低的值对我们的负载测试中的内存消耗没有任何影响.
解决方案2 - 更改activeViewMapsSize(工作)
我们正在调试Mojarra并在以下代码中找到以下代码ViewScopeManager:
Integer size = (Integer) sessionMap.get(ACTIVE_VIEW_MAPS_SIZE);
if (size == null) {
size = 25;
}
Run Code Online (Sandbox Code Playgroud)
保留上次访问的视图的默认大小似乎是25.看到这一点,我们实现了一个Session Listener,它将此值设置为1:
public class SetActiveViewMapsSizeSessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent event) {
event.getSession().setAttribute(ViewScopeManager.ACTIVE_VIEW_MAPS_SIZE, 1);
}
}
Run Code Online (Sandbox Code Playgroud)
这显然有效.由于只保留了1个视图,因此内存停止增长.
为什么25个内存中的观点?
因此,如果Session中没有定义不同的值,Mojarra会保留25个内存视图的历史记录.我找不到任何关于此的文档.有人可以解释这是为了什么?它是针对浏览器的吗?我们在JSF页面上禁用了缓存.因此浏览器将始终创建一个新视图.这不应成为我们的问题.
解决方案2是有效的方法吗?有人可以解释这种方法的缺点吗?
更新1
经过各种评论和更深入的调试后,结果证明:
com.sun.faces.numberOfLogicalViews 定义logicalViewMap大小,该大小仅存储(!)ui组件树的状态com.sun.faces.application.view.activeViewMapsSize 定义activeViewMap的大小,它包含ViewScoped bean当更改numberOfLogicalViews为1时,mojarra仍会跟踪过去25个视图中的所有视图范围内的bean.当你以相反的方式配置它 - numberOfLogicalViews从15 activeViewMapsSize到1时 - 由于我猜想缺少数据,因此无法正确初始化视图.我们甚至没有例外.我想理解,为什么mojarra选择设置activeViewMapsSize高于numberOfLogicalViews和不高,因为我们想调整内存消耗而不会产生不可预测的行为.
更新2 …
根据这篇博客, JSF将无国籍.使用JSF的重点不在于它使保存和恢复状态成为一件苦差事.JSF成为无国籍的重点是什么?能否请您提供一个有用的示例.
在我们的JBoss 7.1.1上的JSF2项目中,我们定义了一个会话超时web.xml,它工作得很好.
但是,有时候我们会看到视图过期,导致像这样的错误,即使会话仍然存在:
javax.faces.application.ViewExpiredException: viewId:/... - View /... could
not be restored.
Run Code Online (Sandbox Code Playgroud)
我们在哪里可以设置视图超时,就像我们为会话所做的那样?或者视图是否由其他内容引起?
似乎今天(2012年4月),MyFaces和Mojarra的JSF 2.1实现都存在部分状态保存的缺陷,并且PARTIAL_STATE_SAVING应设置为false.
这是真的?
我相信以下是真的
javax.faces.STATE_SAVING_METHOD设置为client,则视图永不过期ViewExpiredException将被抛出
javax.faces.STATE_SAVING_METHOD设置为server 并且视图状态不可用我不知道
谢谢
相关:
我正在尝试跟踪视图使用情况(达到默认的 15 计数限制),但不太确定从哪里获取此信息。它在 FacesContext 中可用吗?
使用 JSF 2.2、ICEfaces 3.3 和 Omnifaces 2.2。
jsf ×7
jsf-2 ×5
mojarra ×3
jsf-2.2 ×2
back-button ×1
browser ×1
java ×1
java-ee ×1
logout ×1
myfaces ×1
navigation ×1
omnifaces ×1
redirect ×1
session ×1
state-saving ×1
timeout ×1
url ×1
view ×1
view-scope ×1