”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如何处理JSF表单提交过程中的授权失败?

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

发布于2024-11-08
浏览:433

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-调用)
  • [FullAjaxExceptionHandler 不会在 ajax 上显示会话过期错误页面按钮](https://stackoverflow.com/questions/25366069/fullajaxexceptionhandler-does-not-show-session-expired-error-page-on-ajax-button)
最新教程 更多>
  • 在 Go 中使用 WebSocket 进行实时通信
    在 Go 中使用 WebSocket 进行实时通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    编程 发布于2024-12-23
  • 如何在同一目录中组织一个库和 CLI 的 Go 项目?
    如何在同一目录中组织一个库和 CLI 的 Go 项目?
    在多包项目中组织代码在同时需要库和命令行界面 (CLI) 的 Go 项目中,经常会遇到以下问题在同一目录中有多个包。这样的项目结构:whatever.io/ myproject/ main.go myproject.go包 main 和 func main 对...
    编程 发布于2024-12-23
  • 如何在 Android 中选择后保持 ListView 项目突出显示?
    如何在 Android 中选择后保持 ListView 项目突出显示?
    如何在 Android 中选择后保持 ListView 项目突出显示在 Android 中,维护 ListView 项目的选定状态可以通过提供以下功能来增强用户体验:当前选择的清晰视觉指示器。然而,有时开发人员会遇到这样的问题:所选项目在某些事件(例如滚动或与 ListView 进一步交互)后失去突...
    编程 发布于2024-12-23
  • 如何使用自定义 CSS 在 Bootstrap 3 中创建全高列?
    如何使用自定义 CSS 在 Bootstrap 3 中创建全高列?
    Bootstrap 3 全高列:自定义 CSS 解决方案简介:创建Twitter Bootstrap 3 的全高布局可能具有挑战性。虽然Bootstrap的原生类不支持此功能,但可以使用自定义CSS来实现此效果。自定义CSS方法:设置100% 高度:将 body、container 和 row 元素...
    编程 发布于2024-12-23
  • 除了“if”语句之外:还有什么地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    除了“if”语句之外:还有什么地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    无需强制转换即可上下文转换为 bool您的类定义了对 bool 的显式转换,使您能够在条件语句中直接使用其实例“t”。然而,这种显式转换提出了一个问题:“t”在哪里可以在不进行强制转换的情况下用作 bool?上下文转换场景C 标准指定了四种值可以根据上下文转换为的主要场景bool:语句:if、whi...
    编程 发布于2024-12-23
  • 如何在不使用链接的情况下向 Span 元素添加工具提示?
    如何在不使用链接的情况下向 Span 元素添加工具提示?
    向不带链接的 Span 元素添加工具提示将鼠标悬停在 span 元素上时,通常需要向用户提供附加信息。这可以使用工具提示来实现,而不依赖于链接。解决方案:要使用内置 HTML 属性将工具提示添加到 span 元素,只需按如下方式使用 title 属性:<span title="My ...
    编程 发布于2024-12-23
  • 为什么我的 WebSocket 服务器在 Docker 化后无法连接?
    为什么我的 WebSocket 服务器在 Docker 化后无法连接?
    Docker化 WebSocket 服务器问题开发人员在尝试使用 Docker 容器化 WebSocket 服务器时遇到问题。服务器代码使用“connected”写入新连接,并且在容器外运行良好,但当放置在 Docker 容器内时,客户端会由于“连接重置”错误而出现恐慌,并显示错误消息“read t...
    编程 发布于2024-12-23
  • 如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    MySQL配置不正确:相对路径的问题在Django中运行python manage.py runserver时,可能会遇到以下错误:ImproperlyConfigured: Error loading MySQLdb module: dlopen(/Library/Python/2.7/site-...
    编程 发布于2024-12-23
  • Python中如何导入同目录或子目录中的类?
    Python中如何导入同目录或子目录中的类?
    在Python中从同一目录或子目录导入类在Python中,您可以通过以下方式从同一目录或子目录中的文件导入类利用 __init__.py 文件。该文件是一个空占位符,指示该目录包含模块和包。从同一目录导入从与 main 相同的目录中的文件导入类.py,在该目录中创建一个 __init__.py 文件...
    编程 发布于2024-12-23
  • 为什么C90中函数名可以用作函数指针?
    为什么C90中函数名可以用作函数指针?
    使用函数名称作为函数指针C90 的基本原理文档深入了解了将函数名称与函数指针等同的设计选择。这种便利简化了在特定上下文中使用函数指针的过程。函数声明考虑声明:int f(); int (*pf)();函数调用以下所有表示有效的函数调用:(&f)(); f(); (*f)(); (**f)()...
    编程 发布于2024-12-23
  • 如何在 Python 中使用多个单词边界分隔符将字符串拆分为单词?
    如何在 Python 中使用多个单词边界分隔符将字符串拆分为单词?
    使用多个单词边界定界符将字符串拆分为单词处理文本数据时,常见的任务是将字符串拆分为单个单词。 Python 的 str.split() 方法提供了一个简单的解决方案,但它仅支持单个分隔符作为其参数。在处理包含多种类型的单词边界(例如标点符号)的文本时,此限制可能会成为障碍。Python re 模块提...
    编程 发布于2024-12-23
  • 如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 识别今天生日的用户使用 MySQL 确定今天是否是用户的生日涉及查找生日匹配的所有行今天的日期。这可以通过一个简单的 MySQL 查询来实现,该查询将存储为 UNIX 时间戳的生日与今天的日期进行比较。以下 SQL 查询将获取今天有生日的所有用户: FROM USERS ...
    编程 发布于2024-12-23
  • 为什么 Selenium 在 Chrome 中定位元素时会抛出“NoSuchElementException”?
    为什么 Selenium 在 Chrome 中定位元素时会抛出“NoSuchElementException”?
    "NoSuchElementException" for Chrome with SeleniumIssue尝试在 Chrome 上使用 Selenium 与 QWOP 交互时,始终出现错误消息: selenium.common.exceptions.NoSuchElementE...
    编程 发布于2024-12-23
  • 为什么Java中的静态方法不能是抽象的?
    为什么Java中的静态方法不能是抽象的?
    为什么Java中静态方法不能是抽象的在Java编程中,静态方法不能是抽象的。抽象方法意味着该方法有声明但没有实现,将其留给子类来提供功能。但是,无论是否创建对象实例,静态方法本质上都与类本身相关联。以下示例演示了抽象静态方法的问题:abstract class foo { abstract ...
    编程 发布于2024-12-23
  • 如何将 Qt 调试输出重定向到文件?
    如何将 Qt 调试输出重定向到文件?
    重定向 Qt 调试输出调试 Qt 应用程序时,大量的 qDebug() 和相关语句可能会因过多的调试输出而使控制台变得混乱。对此,开发人员经常寻求一种跨平台的方法来将此输出重定向到文件。Qt方式:qInstallMessageHandlerQt提供了更方便的处理方法使用 qInstallMessag...
    编程 发布于2024-12-23

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3