在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); } } }
有關此主題的更多見解,請參閱以下資源:
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3