在我的 JSF 应用程序中,有一个 Filter
用于检查身份验证过程。当认证失败时,过滤器重定向到login.xhtml
。
如何将 FacesMessage
从 Filter
传递到我的登录页面?
虽然,我用了下面,还是不行。
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, message, null));
AuthenticationFilter.java
public class AuthenticationFilter implements Filter {
private FilterConfig config;
private ServletContext servletContext;
public void init(FilterConfig filterConfig) {
config = filterConfig;
servletContext = config.getServletContext();
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;
HttpSession session = httpRequest.getSession();
User user = (User) session.getAttribute(Constants.LOGIN_USER);
if (user == null) {
...
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, message, null));
String loginView = httpRequest.getContextPath() + Constants.LOGIN_PAGE;
httpResponse.sendRedirect(loginView);
} else if (!user.getRole().equals(Role.SYSTEM_ADMINISTRATOR)) {
....
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, message, null));
String loginView = httpRequest.getContextPath() + Constants.LOGIN_PAGE;
httpResponse.sendRedirect(loginView);
} else {
filterChain.doFilter(servletRequest, servletResponse);
}
servletContext.log("Exiting the filter");
}
public void destroy() {
//Nothing to do.
}
}
最佳答案
FacesContext
由 FacesServlet
创建.当您在过滤器内时,它尚未被调用。过滤器在 servlet 之前运行。所以你永远无法得到 FacesContext
在过滤器中。此外,面孔消息是请求范围内的,因此无论如何重定向都会使它们消失。
让login.xhtml
在 <f:event type="preRenderView">
期间自行设置.最简单的方法是让过滤器将其暂时放在 session 范围内。
session.setAttribute("message", message);
httpResponse.sendRedirect(loginView);
然后在 login.xhtml
的预渲染 View 监听器方法中将其从 session 范围中删除:
String message = (String) externalContext.getSessionMap().remove("message");
if (message != null) {
context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, message, null));
}
关于java - 通过过滤器设置 FacesMessage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13984621/