java - 通过过滤器设置 FacesMessage

标签 java jsf message servlet-filters

在我的 JSF 应用程序中,有一个 Filter 用于检查身份验证过程。当认证失败时,过滤器重定向到login.xhtml

如何将 FacesMessageFilter 传递到我的登录页面?

虽然,我用了下面,还是不行。

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.
    }
}

最佳答案

FacesContextFacesServlet 创建.当您在过滤器内时,它尚未被调用。过滤器在 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/

相关文章:

java - Cloud endpoint api 中的函数 User.getUserId() 为不为 null 的用户对象返回 null

java - 当类从线程扩展时,如何使用 resultreceiver 发送数据

linux - 为什么 MPI 给出运行时错误

servlets - 为什么 Java servlet 不能每次都获取 Paypal IPN 消息?

java - 如何使 Lucene 5.5.0 StandardAnalyzer 与 Lucene 2.9.0 StandardAnalyzer 保持一致?

java - 调用失败的org.apache.hadoop.hdfs.server.datanode.DataNode

javascript - JSF 表单 - 提交 > 关注选定的输入

java - 从 JasperReports 打印 PDF

java - 查看 mojarra 上的过期问题

C - 替换 "No such file or directory"消息