Al implementar mecanismos de autorización personalizados en aplicaciones JSF, es crucial comprender la distinción entre navegación de página y envío de formularios . Si bien los redireccionamientos funcionan perfectamente para la navegación de la página, pueden encontrar problemas durante el envío de formularios.
La causa principal de este problema radica en el hecho de que los envíos de formularios JSF desencadenan solicitudes asincrónicas. Cuando se envía una redirección como respuesta a una solicitud asincrónica, el motor JSF AJAX espera una respuesta XML específica. Sin embargo, enviar una página HTML normal viola esta expectativa, lo que hace que el usuario permanezca en la misma página.
Usar un servlet personalizado para realizar comprobaciones de autorización introduce una complejidad adicional y problemas potenciales. En cambio, el enfoque recomendado es utilizar un filtro de servlet diseñado específicamente para este propósito. Los filtros ofrecen un medio más sólido y eficiente para interceptar solicitudes entrantes.
A continuación se muestra un ejemplo de un filtro de servlet que maneja las comprobaciones de autorización de manera efectiva:
@WebFilter("/*") public class AuthorizationFilter implements Filter { private static final String AJAX_REDIRECT_XML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" "<partial-response><redirect url=\"%s\"></redirect></partial-response>"; @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; HttpSession session = request.getSession(false); String loginURL = request.getContextPath() "/login.xhtml"; boolean loggedIn = (session != null) && (session.getAttribute("user") != null); boolean loginRequest = request.getRequestURI().equals(loginURL); boolean resourceRequest = request.getRequestURI().startsWith(request.getContextPath() ResourceHandler.RESOURCE_IDENTIFIER "/"); boolean ajaxRequest = "partial/ajax".equals(request.getHeader("Faces-Request")); if (loggedIn || loginRequest || resourceRequest) { // Continue request. chain.doFilter(request, response); } else if (ajaxRequest) { // Send special XML response to instruct JSF AJAX to redirect. response.setContentType("text/xml"); response.setCharacterEncoding("UTF-8"); response.getWriter().printf(AJAX_REDIRECT_XML, loginURL); } else { // Perform стандартный синхронный редирект. response.sendRedirect(loginURL); } } }
Para obtener más información sobre este tema, consulte los siguientes recursos:
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3