」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何處理JSF表單提交過程中的授權失敗?

如何處理JSF表單提交過程中的授權失敗?

發佈於2024-11-08
瀏覽:812

How to Handle Authorization Failures During JSF Form Submissions?

JSF 表單提交期間的授權失敗:綜合分析

在JSF 應用程式中實現自訂授權機制時,了解頁面導航和表單提交之間的區別至關重要。雖然重定向可以無縫地進行頁面導航,但它們在表單提交期間可能會遇到問題。

問題原因

此問題的根本原因在於 JSF 表單提交觸發非同步請求。當發送重定向作為對非同步請求的回應時,JSF AJAX 引擎需要特定的 XML 回應。然而,發送常規 HTML 頁面違反了這一預期,導致用戶停留在同一頁上。

工作的錯誤工具

使用自訂 servlet 執行授權檢查會帶來額外的複雜性和潛在的問題。相反,建議的方法是使用專為此目的設計的 servlet 過濾器。過濾器提供了一種更強大、更有效率的方法來攔截傳入請求。

綜合過濾器實作

下面是有效處理授權檢查的 servlet 過濾器範例:

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

}

需要考慮的其他資源

有關此主題的更多見解,請參閱以下資源:

  • [使用JSF 2.0 / Facelets,有沒有辦法將全域偵聽器附加到所有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 不在ajax按鈕上顯示會話過期錯誤頁面](https://stackoverflow.com/questions/25366069/fullajaxexceptionhandler-does-not-show- session-expired-error-page-on-ajax-button)
最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3