- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个不受 j_security_check
保护的 JSF 页面。我执行以下步骤:
Firebug 显示按预期引发了 ViewExpiredException
。
Post:
javax.faces.ViewState=8887124636062606698:-1513851009188353364
Response:
<partial-response>
<error>
<error-name>class javax.faces.application.ViewExpiredException</error-name>
<error-message>viewId:/viewer.xhtml - View /viewer.xhtml could not be restored.</error-message>
</error>
</partial-response>
但是,一旦我将页面配置为受 j_security_check
保护并执行上面列出的相同步骤,奇怪的是(对我来说)ViewExpiredException
不再引发。相反,响应只是一个新的 View 状态。
Post:
javax.faces.ViewState=-4873187770744721574:8069938124611303615
Response:
<partial-response>
<changes>
<update id="javax.faces.ViewState">234065619769382809:-4498953143834600826</update>
</changes>
</partial-response>
有人可以帮我解决这个问题吗?我希望它引发异常,以便我可以处理该异常并显示错误页面。现在它只是响应一个新的 ViewState,我的页面卡住了,没有任何视觉反馈。
最佳答案
我能够重现您的问题。这里发生的情况是,容器按照安全约束中的指定调用 RequestDispatcher#forward()
到登录页面。然而,如果登录页面本身也是一个 JSF 页面,那么在转发的请求上也会调用 FacesServlet 。由于请求是转发,这将简单地在转发的资源(登录页面)上创建一个新 View 。但是,由于它是一个 ajax 请求,并且没有渲染信息(整个 POST 请求在安全检查期间基本上被丢弃),因此只会返回 View 状态。
请注意,如果登录页面不是 JSF 页面(例如 JSP 或纯 HTML),则 ajax 请求将返回页面的整个 HTML 输出作为 ajax 响应,该响应无法被 JSF ajax 解析并解释为“空” “回应。
不幸的是,它正在“按设计”工作。我怀疑 JSF 规范对 ajax 请求的安全约束检查存在一些监督。毕竟原因是可以理解的,而且幸运的是很容易解决。只是,您实际上不想在此处显示错误页面,而只想显示整个登录页面,就像在非 ajax 请求期间发生的情况一样。您只需检查当前请求是否是 ajax 请求并已转发到登录页面,然后您需要发送一个特殊的“重定向”ajax 响应,以便更改整个 View 。
您可以使用 PhaseListener
实现此目的,如下所示:
public class AjaxLoginListener implements PhaseListener {
@Override
public PhaseId getPhaseId() {
return PhaseId.RESTORE_VIEW;
}
@Override
public void beforePhase(PhaseEvent event) {
// NOOP.
}
@Override
public void afterPhase(PhaseEvent event) {
FacesContext context = event.getFacesContext();
HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
String originalURL = (String) request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI);
String loginURL = request.getContextPath() + "/login.xhtml";
if (context.getPartialViewContext().isAjaxRequest()
&& originalURL != null
&& loginURL.equals(request.getRequestURI()))
{
try {
context.getExternalContext().invalidateSession();
context.getExternalContext().redirect(originalURL);
} catch (IOException e) {
throw new FacesException(e);
}
}
}
}
<小时/>
更新此解决方案自OmniFaces 1.2起已内置于 OmniPartialViewContext
。因此,如果您碰巧已经使用了 OmniFaces,那么这个问题就是 fully transparently已解决,您不需要为此自定义 PhaseListener
。
关于ajax - 如果 JSF 页面受 j_security_check 保护,则 ajax 请求不会引发 ViewExpiredException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61005524/
我尝试关注不同的帖子,了解如何在 GlassFish 3.1 上的 Mojarra 2.1.0(使用 RichFaces 4)中处理 ViewExpiredException。但是我在 web.xml
我让一些带有表单的选项卡打开,当我按下命令按钮时( session 过期一段时间后)我收到一个 java 脚本警报说: serverError: class javax.faces.applicati
一周前,我研究了 ViewExpiredException,并阅读了几篇关于它的文章。 viewExpiredException JSF How to control web page caching
我想弄清楚如何防止 Session Fixation在 Glassfish 3.1 中的 JSF 登录表单上。 使用 Servlets 很容易做到,所以我试图对 JSF 做同样的事情(基于这个问题:R
我有一个使用rich:fileUpload 上传文件的页面。对于较小的文件,这可以正常工作,但是对于较大的文件 (+80MB),我通常会收到 ViewExpiredException。我已经尝试寻找解
我有包装器 PrimeFaces.ajax.AjaxResponse 来处理 ViewExpiredException(重新加载页面): var handleViewExpired = functio
JSF 应用程序可以在 session 过期时抛出 ViewExpiredException。当您的系统上有 guest 时,此事件将很常见。因此,应用程序将处理此事件而不会给访客带来任何麻烦,如下所
我正在 Glassfish v3 上开发一个 JSF 2.0 应用程序,我正在尝试处理 ViewExpiredException。但无论我做什么,我总是收到 Glassfish 错误报告,而不是我自己
我在我的项目中使用 JSF 2.0 和 Primefaces。 我有两个 xhtml 页面,即 Cars.xhtml 和 Bikes.xhtml。 我正在使用 ViewScoped 支持 bean。
我的 h:commandButton "Login"有问题:当我使用 @ViewScoped 并按下此按钮时,会出现 ViewExpiredException,但是当我使用 @SessionScope
出于记录目的,我有兴趣检测 JSF 应用程序中何时发生 session 超时。 我已经实现了一个 PhaseListener 来检查用户是否已登录并且其 session 是否已处于 Activity
在我的网络应用程序中,当 session 过期并且用户发起请求(完整页面或 AJAX)时,用户将被重定向到登录页面,并显示 session 已过期的消息。问题是,当登录页面保持打开的时间足够长以致 s
我已将以下内容放入我的 web.xml 中: javax.faces.application.ViewExpiredException /expiredIndex.jsf
我们最近将一个主要平台从 jsf 1.2 升级到了 2.0。升级后,我们每小时都会收到几个 ViewExpiredException 错误。通过阅读该主题,这似乎是 session 过期时的预期异常,
我有一个 Web 应用程序当前部署在 Wildfly 22 上,使用 JSF 2.3 和 OpenJDK 11。我目前正在将登录页面从 j_security_check 迁移到编程登录,按照这篇文章中
我有一个 jsf 1.2 应用程序,索引页中有一些链接。该链接可通过在新的 jquery 对话框中单击来打开。每个链接都会在不同的对话框中打开我的应用程序的新页面,因此,应用程序可以在单个页面的多个对
我按如下方式设置我的网络应用程序: javax.faces.application.ViewExpiredException /WEB-INF/include/vi
我们的应用程序使用的是 SUN JSF 1.2、WebSphere 7.0,我们仅在负载测试期间收到 ViewExpiredException 我已浏览以下链接 javax.faces.applica
我遇到一个问题,每次我重新部署我的应用程序时,任何现有 session 都会中断并且请求会导致 ViewExpiredException .相关问题或外部邮件列表/论坛帖子中的建议似乎都无法解决此问题
我使用 jsf、prettyfaces 和 hibernate 创建了此网页我环顾四周,大多数人说这个错误是因为缓存大多数人在登录、注销并尝试重新登录后发现此错误但我在登录时发现此错误,并且当我尝试导
我是一名优秀的程序员,十分优秀!