"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como lidar com falhas de autorização durante envios de formulários JSF?

Como lidar com falhas de autorização durante envios de formulários JSF?

Publicado em 2024-11-08
Navegar:428

How to Handle Authorization Failures During JSF Form Submissions?

Falhas de autorização durante envios de formulários JSF: uma análise abrangente

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.

Causa do problema

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.

A ferramenta errada para o trabalho

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.

Uma implementação abrangente de filtro

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);
    }
  }

}

Recursos adicionais para consideração

Para obter mais informações sobre este tópico, consulte os seguintes recursos:

  • [Usando JSF 2.0 / Facelets, existe uma maneira anexar um ouvinte global a todas as chamadas AJAX?](https://stackoverflow.com/questions/11687648/using-jsf-2-0-facelets-is-there-a-way-to-attach-a-global- listener-to-all-ajax-calls)
  • [FullAjaxExceptionHandler não mostra página de erro de sessão expirada no botão ajax](https://stackoverflow.com/questions/25366069/fullajaxexceptionhandler-does-not-show- página de erro de sessão expirada no botão Ajax)
Tutorial mais recente Mais>

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