在我登录之前,我可以点击安全约束目录之外的任何内容。如果我尝试转到安全约束目录内的某个位置,它会将我重定向到表单登录页面。如你所料。
登录后,我可以开展我的业务,并在我的安全约束内外访问资源。
但是,当 LTPA 令牌过期(仍然有活动会话)并且我尝试转到不受限制的页面时,比如说被重定向到登录页面,我在标题中收到错误。
所以我想弄清楚一些事情: 1. 我可以让 LTPA 令牌像我的会话一样不会过期吗?2. 当 LTPA 令牌过期时,我可以使我的会话过期吗?3. 为什么我不能匿名访问无限制页面?它清楚地认识到我的 LTPA 令牌已过期并试图将我重定向到登录。在这一点上它失败了。
好的,所以有一个过滤器。过滤器将未登录的人重定向到登录页面。但是问题再次出现,一旦 ltpa 令牌过期,这条线就无法((HttpServletRequest) request).getSession(false)
在标题中抛出异常,UnauthorizedSessionRequestException
. 如您所见,我试图捕捉该错误并注销。哪一个,糟糕,又抛出一个UnauthorizedSessionRequestException
. 那么我如何不使用会话呢?
@Override
public void doFilter(final ServletRequest request, final ServletResponse response,
final FilterChain chain) throws IOException, ServletException
{
final String sourceMethod = "doFilter";
if (logger.isLoggable(Level.FINER)) {
logger.entering(sourceClass, sourceMethod, new Object[] { request, response, chain });
}
try {
final HttpSession session = ((HttpServletRequest) request).getSession(false);
final UserBean user = (session != null) ? (UserBean) session.getAttribute("userBean")
: null;
if (user == null || (user != null && !user.isLoggedOn())) {
final HttpServletResponse res = (HttpServletResponse) response;
res.sendRedirect("../login.jsf");
}
} catch (final UnauthorizedSessionRequestException exc) {
((HttpServletRequest) request).logout();
final HttpServletResponse res = (HttpServletResponse) response;
res.sendRedirect("../login.jsf");
} catch (final Exception exc) {
final ServletException exception = new ServletException(
"[UserBeanFilter] Exception doFilter.", exc);
logger.throwing(sourceClass, sourceMethod, exception);
throw exception;
}
chain.doFilter(request, response);
logger.exiting(sourceClass, sourceMethod);
}