Pertanyaan Atur FacesMessage oleh Filter


Dalam Aplikasi JSF saya, ada a Filter yang digunakan untuk memeriksa proses authenticati0n. Ketika otentikasi gagal, filter diarahkan ke login.xhtml.

Bagaimana saya bisa lulus FacesMessage ke halaman login saya dari Filter?

Meskipun, saya menggunakan di bawah ini, itu tidak baik.

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

5
2017-12-21 05:12


asal


Jawaban:


Itu FacesContext dibuat oleh FacesServlet. Ketika Anda berada di dalam filter, itu belum diaktifkan. Filter berjalan sebelum servlet. Jadi Anda tidak pernah bisa mendapatkan tangan untuk itu FacesContext dalam filter. Plus, wajah pesan adalah permintaan yang dicakup, jadi pengalihan akan membuat mereka menghilang juga.

Biarkan login.xhtml mengaturnya dengan sendirinya selama <f:event type="preRenderView">. Cara termudah adalah membiarkan filter meletakkannya sementara di lingkup sesi.

session.setAttribute("message", message);
httpResponse.sendRedirect(loginView);

Yang kemudian Anda hapus dari lingkup sesi dalam metode render view pendengar dari login.xhtml:

String message = (String) externalContext.getSessionMap().remove("message");

if (message != null) {
    context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, message, null));
}

7
2017-12-21 05:22



Saya mengalami masalah serupa dengan mencoba mendapatkan FacesContext dalam pengatur waktu EJB. BalusC telah menunjukkan pada beberapa utas bahwa tidak mungkin melakukan ini. Atau Anda dapat menggunakan 'ServletContextListener', tetapi ScheduledExecutorService tidak menentukan penjadwalan sebaik pengatur waktu EJB.

Dalam setiap kasus, satu saran yang dia buat adalah untuk benar-benar membuat permintaan web ke paged JSF yang didukung oleh kacang yang dikelola untuk menggunakan metode pada kacang berleher aplikasi yang saya ingin mengatur dengan timer.

Saya menyebutkan ini, karena sepertinya Anda bisa melakukan sesuatu yang serupa, di mana Anda mengirimkan param ke halaman JSF dengan pesan yang Anda inginkan dan alamat IP pengguna atau sesuatu. Halaman itu dapat didukung oleh kacang yang diberi label yang memiliki aplikasi kacang yang disuntikkan ke dalamnya yang menyimpannya di peta dengan IP sebagai kuncinya. Kemudian ketika pengguna dialihkan ke halaman login, halaman itu bisa memanggil metode pesan kesalahan mendapatkan pada permintaan scoped bean dengan aplikasi yang sama dengan kacang yang disuntikkan ke dalamnya yang mendapatkan pesan kesalahan untuk IP itu atau sesuatu di sepanjang garis tersebut.

Dalam hal apapun, saya yakin bahwa jawaban BalusC cukup dan lebih tepat daripada ini, tapi permintaannya 'hanya meminta dari saran ejb timer' bekerja dengan baik bagi saya untuk menjadwalkan metode panggilan pada aplikasi biji-bijian, dan saya pikir saya mungkin akan membawa up kemungkinan penggunaannya di sini.

@BalusC apakah Anda tahu tentang postingan yang saya maksud? Saya tidak dapat menemukannya.


0
2017-12-22 06:33