gpt4 book ai didi

session - 检查 session 是否存在JSF

转载 作者:行者123 更新时间:2023-12-04 05:20:32 25 4
gpt4 key购买 nike

我有一个登录页面,在该页面上有一个User Bean,用于验证用户的用户名和密码。此Bean是 session 范围的。
如果有人编写了URL并试图跳出登录页面,我该如何检查并将其重定向到登录页面?

另一方面。假设我已经登录并且正在工作,突然间我出去了一段时间, session 期满了。当我返回并尝试与表单进行交互时,它会发送一条消息,提醒我 session 到期。发生这种情况时,如何重新重定向到登录表单?

提前致谢。希望我能解释一下自己。

Mojarra 2.1.4,Tomcat 7,Tomahawk 1.1.11

最佳答案

If someone writes a URL and tries to jump the login page, how can I check that and redirect him to the login page?



您似乎正在使用本地认证。在这种情况下,您需要实现 servlet filter。 JSF将 session 范围的托管bean作为 HttpSession的属性存储,因此您可以在 doFilter()方法中进行检查:
HttpServletRequest req = (HttpServletRequest) request;
UserManager userManager = (UserManager) req.getSession().getAttribute("userManager");

if (userManager != null && userManager.isLoggedIn()) {
chain.doFilter(request, response);
} else {
HttpServletResponse res = (HttpServletResponse) response;
res.sendRedirect(req.getContextPath() + "/login.xhtml");
}

将此过滤器映射到覆盖 protected 页面的网址格式,例如 /app/*

When I return and try to interact with the form it sends a message alerting me the session expiration. How can I redirect again to the login form when this occurs?



我了解这涉及到Ajax请求吗?对于正常的请求,您可以在 <error-page>中使用 web.xml。如果按照以下方式在 web.xml中将状态保存方法设置为客户端
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>

不是一个选择,那么您需要实现一个自定义的 ExceptionHandler :
public class ViewExpiredExceptionHandler extends ExceptionHandlerWrapper {

private ExceptionHandler wrapped;

public ViewExpiredExceptionHandler(ExceptionHandler wrapped) {
this.wrapped = wrapped;
}

@Override
public void handle() throws FacesException {
FacesContext facesContext = FacesContext.getCurrentInstance();

for (Iterator<ExceptionQueuedEvent> iter = getUnhandledExceptionQueuedEvents().iterator(); iter.hasNext();) {
Throwable exception = iter.next().getContext().getException();

if (exception instanceof ViewExpiredException) {
facesContext.getApplication().getNavigationHandler().handleNavigation(facesContext, null, "viewexpired");
facesContext.renderResponse();
iter.remove();
}
}

getWrapped().handle();
}

@Override
public ExceptionHandler getWrapped() {
return wrapped;
}

}

(请注意,这个特定示例导航到 viewexpired,因此它期望将 /viewexpired.xhtml作为错误页面)

上面的内容需要通过以下 ExceptionHandlerFactory 实现来完成:
public class ViewExpiredExceptionHandlerFactory extends ExceptionHandlerFactory {

private ExceptionHandlerFactory parent;

public ViewExpiredExceptionHandlerFactory(ExceptionHandlerFactory parent) {
this.parent = parent;
}

@Override
public ExceptionHandler getExceptionHandler() {
return new ViewExpiredExceptionHandler(parent.getExceptionHandler());
}

}

依次需要在 faces-config.xml中进行注册,如下所示:
<factory>
<exception-handler-factory>com.example.ViewExpiredExceptionHandlerFactory</exception-handler-factory>
</factory>

关于session - 检查 session 是否存在JSF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8144195/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com