我已经实现了一个 Servlet 过滤器来执行我的系统授权,并在需要时使用以下命令重定向用户:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
...
if(!isLoggedIn(currentUser)){
if(isSecurePage(requestedPage)){
redirectUser(resp,USER_LOGIN_PAGE);
}
else{ // Carry on
chain.doFilter(request,response);
}
}
else{
if(!isSecurePage(requestedPage)){
redirectUser(resp,USER_WELCOME_PAGE);
}
else if(!canAccess(currentUser,requestedPage)){
redirectUser(resp,req.getContextPath() + USER_DENIED_PAGE);
}
else{ // Carry on
chain.doFilter(request,response);
}
}
}
private void redirectUser(HttpServletResponse response, String page) throws IOException {
response.sendRedirect(page);
}
重定向正确发生。我的问题是,虽然显示了 ACCESS_DENIED_PAGE,但原始请求背后的 JSF 操作方法仍然被执行(例如,它创建的 FacesMessage 显示在 ACCESS_DENIED_PAGE 中)。
如何防止这种情况?