首页 >Java >java教程 >如何处理JSF表单提交过程中的授权失败?

如何处理JSF表单提交过程中的授权失败?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-10-30 05:51:02409浏览

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 -ajax 按钮上的页面)

以上是如何处理JSF表单提交过程中的授权失败?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn