Ao implementar mecanismos de autorização personalizados em aplicativos JSF, é crucial entender a distinção entre navegação de página e envios de formulários . Embora os redirecionamentos funcionem perfeitamente para a navegação na página, eles podem encontrar problemas durante os envios de formulários.
A causa raiz desse problema está no fato de que os envios de formulários JSF acionam solicitações assíncronas. Quando um redirecionamento é enviado como resposta a uma solicitação assíncrona, o mecanismo JSF AJAX espera uma resposta XML específica. No entanto, enviar uma página HTML normal viola essa expectativa, fazendo com que o usuário permaneça na mesma página.
Usar um servlet personalizado para realizar verificações de autorização introduz complexidade adicional e possíveis problemas. Em vez disso, a abordagem recomendada é utilizar um filtro de servlet projetado especificamente para essa finalidade. Os filtros oferecem um meio mais robusto e eficiente de interceptar solicitações recebidas.
Abaixo está um exemplo de filtro de servlet que lida com verificações de autorização de maneira eficaz:
@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 obter mais informações sobre este tópico, consulte os seguintes recursos:
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3