C’è un modo semplice per eseguire il preprocesso e il reindirizzamento delle richieste GET?

Sto cercando una risposta alle migliori pratiche. Voglio fare un po ‘di pre-elaborazione per le richieste GET. Ad esempio, se l’utente non è autorizzato a visualizzare la pagina, reindirizzarlo a un’altra pagina. Ma non voglio usare il normale filtro servlet, perché vorrei esprimere questo comportamento in faces-config.xml . È ansible e come si chiama, come può essere fatto?

Posso definire un bean Filter che restituisca anche una stringa che dice il faces-config.xml dove andare dopo?

Ho cercato su google per questo, ma ho cliccato solo sui normali filtri. Se utilizzo i filtri, un @WebFilter può essere un @ManagedBean allo stesso tempo? O è quel cattivo stile?

    Se si esegue l’homegrowing dell’autenticazione della richiesta HTTP su JSF, un filtro servlet rappresenta davvero l’approccio migliore. JSF è “solo” un framework MVC e non è stato specificato nulla nell’API JSF per filtrare le richieste HTTP in ingresso per verificare l’autenticazione dell’utente. Sulle normali richieste GET, un bean gestito JSF viene solitamente creato solo quando la risposta HTTP sta per essere creata e inviata, o forse è già stata commessa. Questo non è controllabile dall’interno del bean gestito. Se la risposta è già stata commessa, non sarà più ansible cambiarla (reindirizzarla). L’autenticazione e la modifica della richiesta / risposta devono essere fatte molto prima che la risposta stia per essere inviata.

    Se non fossi un’autenticazione di homegrowing, allora potresti aver usato l’autenticazione gestita dal contenitore Java EE per questo che deve essere dichiarata dalle voci in web.xml . Nota che questo è anche disaccoppiato da JSF, ma almeno ti salva dalla homegrowing di un filtro servlet e di un bean gestito.

    L’approccio generale consiste nel raggruppare le pagine riservate dietro un determinato pattern URL come /app/* , /private/* , /secured/* , etc e per trarre il massimo vantaggio dal fatto che JSF memorizza i bean con scope di sessione come attributi HttpSession . Immagina di avere un bean UserManager gestito gestito con scope della sessione JSF che trattiene l’utente loggato, quindi puoi verificarlo come segue:

     @WebFilter(urlPatterns={"/app/*"}) public class AuthenticationFilter implements Filter { @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; HttpSession session = request.getSession(false); UserManager userManager = (session != null) ? (UserManager) session.getAttribute("userManager") : null; if (userManager == null || !userManager.isLoggedIn()) { response.sendRedirect(request.getContextPath() + "/login.xhtml"); // No logged-in user found, so redirect to login page. } else { chain.doFilter(req, res); // Logged-in user found, so just continue request. } } // ... } 

    Se stai usando JSF 2.2+, c’è un altro modo per controllare la risposta prima che sia stata inviata. Puoi usare . Metti il ​​seguente da qualche parte nella tua vista:

        

    con

     @Named @RequestScoped // Scope doesn't matter actually. The listener will always be called on every request. public class Authenticator { public String check() { if (authenticated) { return null; } else { return "login?faces-redirect=true"; } } // ... } 

    Questo è garantito per essere sparato prima che la risposta sia resa. Altrimenti quando si fa il lavoro, ad esempio @PostConstruct , si rischia di java.lang.IllegalStateException: response already committed quando il bean viene creato per la prima volta quando la risposta è già stata parzialmente renderizzata (e impegnata).

    Non considererei solo una pratica “migliore” quando si tratta di gestire l’autenticazione HTTP. Lo rende troppo stretto in JSF. Dovresti davvero continuare a usare un filtro servlet. Ma per altri scopi, potrebbe andare bene.

    Guarda anche:

    • Quando usare f: viewAction / preRenderView contro PostConstruct?
    • Per cosa possono essere usati , e ?
    • Limitazioni dell’utilizzo di un PhaseListener anziché di un filtro servlet per l’authorization