如何优雅地处理Spring Security中未由ControllerAdvice处理的异常?

2024-04-01

我最近在我的 Spring 4 / Hibernate Web 应用程序中实现了 Spring Security 来处理登录/注销和不同的用户角色。

经过大量阅读后,它现在看起来工作得很好,但我注意到由于错误的 Spring Security 配置而引发的异常没有使用我的自定义处理程序正常处理,而是显示为丑陋的 Tomcat 错误页面(显示 HTTP Status 500 - UserDetailsS​​ervice 是需要后跟堆栈跟踪)。

解决特定错误并不困难(在 RememberMe 配置中添加 userDetailsS​​ervice(userDetailsS​​ervice)),但事实是,抛出的某些异常并未由 下面显示的 ControllerAdvice 处理 MaxUploadSizeExceededException 和所有其他运行时异常:

@ControllerAdvice
public class ExceptionHandlingControllerAdvice {

public static final String DEFAULT_ERROR_VIEW = "genericerror";

@ExceptionHandler(value = MaxUploadSizeExceededException.class)
public View maxUploadSizeExceededExceptionHandler(
        HttpServletRequest req) throws IOException {

    String redirectUrl = req.getRequestURL().toString();

    RedirectView rv = new RedirectView(redirectUrl);

    FlashMap outputFlashMap = RequestContextUtils.getOutputFlashMap(req);
    if (outputFlashMap != null) {
        outputFlashMap.put(KeyConstants.FLASH_ERROR_KEY, "Bestand is te groot");
    }
    return rv;
}

@ExceptionHandler(value = RuntimeException.class)
public View defaultErrorHandler(HttpServletRequest req, Exception e) {

    RedirectView rv = new RedirectView("/error", true); //context relative

    StackTraceElement[] steArray = e.getStackTrace();
    StringBuilder stackTrace = new StringBuilder();
    for (StackTraceElement element: steArray) {
        stackTrace.append(element.toString() + "\n");
    }

    FlashMap outputFlashMap = RequestContextUtils.getOutputFlashMap(req);
    if (outputFlashMap != null) {
        outputFlashMap.put("url", req.getRequestURL());
        outputFlashMap.put("excClassName", e.getClass().getName());
        outputFlashMap.put("excMessage", e.getMessage());
        outputFlashMap.put("excStacktrace", stackTrace.toString());
    }
    e.printStackTrace();

    return rv;
}
}

但是,这种机制可能无法捕获由不完整配置的 Security 引发的异常,因为在调用任何控制器方法之前,Spring Security 会拦截登录 POST 请求。我想在自定义错误页面上以优雅的方式显示所有异常,以及在控制器到位之前抛出的异常。

我找不到太多相关信息,Spring 手册中描述的所有错误处理技术(http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#mvc-exceptionhandlers http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#mvc-exceptionhandlers)似乎使用控制器建议。

是否有一种方便的方法以通用方式处理所有异常?并使我的控​​制器建议类处理异常变得多余?


正如你所注意到的,@ExceptionHandler不适用于 Spring MVC 外部(堆中低于)抛出的异常。

您可以通过在 web.xml 中指定错误页面来捕获其他地方未捕获的所有异常:

<error-page>
  <exception-type>java.lang.Throwable</exception-type>
  <location>/500</location>
</error-page>

您将这个 500 页面作为普通页面,通常在 Spring MVC 中:

@RequestMapping(value="/500")
public @ResponseBody String handleException(HttpServletRequest req) {

    // this will get the exception thrown/caught
    Throwable exception = (Throwable)req.getAttribute("javax.servlet.error.exception");

    // customize the response as you want
    return "Internal server error.";
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何优雅地处理Spring Security中未由ControllerAdvice处理的异常? 的相关文章

随机推荐

  • 在Python中使用numpy和scipy在matplotlib中制作分箱箱线图

    我有一个包含值对的二维数组 我想通过 x 值的不同箱来绘制 y 值的箱线图 IE 如果数组是 my array array 1 40 5 4 5 60 然后我想对 my array 0 进行分箱 然后对于每个分箱 生成属于每个框中的相应 m
  • 语法错误:WITH 在此位置输入无效

    所以我有这个类似的请求 WITH customers in usa AS SELECT customerName state FROM customers WHERE country USA SELECT customerName FROM
  • 查找字符串中重复的单词并计算重复次数

    我需要找到字符串上重复的单词 然后计算它们重复的次数 基本上 如果输入字符串是这样的 String s House House House Dog Dog Dog Dog 我需要创建一个不重复的新字符串列表 并将每个单词的重复次数保存在其他
  • 更改 viewpager 中当前片段的背景图像

    我在 viewpager 中有 4 个片段 FragmentStatePagerAdapter 在我的 viewpager 所在的活动中 FragmentStatePagerAdapter 的 newInstance 方法将布局 id 作为
  • Quarkus & Microprofile:是否有更好的方法将 application.properties 中的属性使用到 @ClientHeaderParam 中?

    我正在尝试构建一个简单的应用程序来调用 APIquarkus rest client 我必须注入一个 API 密钥作为标头 该标头对于 API 的所有资源都是相同的 所以我想把这个API Key的值 这取决于环境 dev qa prod 在
  • 将焦点设置回文本框

    在用户移动到用户表单上的下一个字段之前 我需要检查文本框是否为空 空或空白 这是检查文本框是否为空 null 空白的代码 我的问题是它不会将焦点返回到文本框 而是移动到用户表单中的下一个字段 Private Sub txtTDYLocati
  • 3 层模式与 MVVM 的比较

    我不知道MVVM 我总是遵循 3 层模式 其中一层是 UI 另一层是业务层 最后一层是数据访问层 在这一层中 我们将请求从 UI 发送到业务层 业务层与数据访问层进行交互 在这种模式下 一切都很顺利 那么我的问题是为什么要学习 MVVM M
  • 取消引用后 *p++ 会递增吗? [复制]

    这个问题在这里已经有答案了 我不太确定这里的顺序是什么 是吗 1 增加指针p的值后取消引用它 2 在增加指针 p 的值之前先取消引用它 增量和取消引用之间没有顺序 但是 那 运算符应用于结果p 这是原始值p在增量之前
  • 仅在平板电脑上支持 Android N+ 分屏

    有没有办法仅在足够大的屏幕上配置对活动的多窗口支持 例如药片 https developer android com preview features multi window html configuring https develope
  • SQL Server INNER JOIN 具有多个关系的多个内连接

    我有以下查询 它工作得很好 但我需要从另一个名为 FB 的表中提取 BUserName 该表具有与 FU 表中的 UserID 相关的 UserID 字段 这可能吗 SELECT TOP 100 FF XID FF YID FF Title
  • MvcSiteMap 生成菜单而不弄乱面包屑

    我正在配置我的 asp net mvc 5 应用程序以使用 MvcSiteMap 库 到目前为止 我可以成功配置面包屑 然而 菜单模板比面包屑要复杂得多 我有小胡子版本的菜单 我没有显示 ul 标签
  • .h 文件中应包含哪些内容?

    将代码分成多个文件时 究竟应该将哪些内容放入 h文件以及应该放入的内容 cpp file 头文件 h 旨在提供多个文件中所需的信息 类声明 函数原型和枚举等内容通常位于头文件中 一句话 定义 代码文件 cpp 旨在提供只需要在一个文件中了解
  • Gradle - FatJar - 无法找到或加载主类

    我知道这个问题被问了很多并且有很多答案 但我仍然明白 但我不明白为什么 我正在尝试生成一个 jar来自与 gradle 具有依赖关系的项目 我有课src main java Launcher java 其中我有我的main method 有
  • python 中是否可以从子线程中杀死父线程?

    我在 Windows 上使用 Python 3 5 2 我想运行一个 python 脚本 但保证它不会花费超过N秒 如果它does采取超过N秒 应该引发异常 并且程序应该退出 最初我以为我可以在开始时启动一个线程来等待N抛出异常之前的秒数
  • 如何从角度4中的url获取参数?

    我正在尝试从 URL 获取开始日期 网址看起来像http sitename booking startdate 28 08 2017 我的代码如下 aap module ts import NgModule declarations App
  • Maven 无法找到 AEM 原型

    我已经开始解决这个问题很长时间了 我正在处理 Adob e wknd 项目 但我无法通过这个命令 并且大部分工作都是基于它构建的 mvn archetype generate DarchetypeGroupId com adobe gran
  • Google+ 登录在 Android 片段上无法正常工作

    我正在使用 google 登录我的应用程序 当我使用活动完成它的工作魅力之后 我将代码移动到片段中 之后当我尝试登录 google 时 它不起作用 我必须打开片段活动2 次登录 google 谁能告诉我发生了什么代码片段添加在下面 publ
  • Rails 的问题 has_many 关系

    我正在编写一个应用程序 用户既可以创建自己的页面供人们发帖 也可以关注用户创建的页面上的帖子 这是我目前的模型关系的样子 class User lt ActiveRecord Base has many pages has many pos
  • Java 编译时未在源代码中获取该文件

    最近我遇到了一个 Java 问题 我尝试了在网上找到的一些方法 但没有成功 所以我需要帮助 我在 Eclipse 中有一个 Java 项目 我的主要课程是在src programCode UI Main2 java 在那里面 java我尝试
  • 如何优雅地处理Spring Security中未由ControllerAdvice处理的异常?

    我最近在我的 Spring 4 Hibernate Web 应用程序中实现了 Spring Security 来处理登录 注销和不同的用户角色 经过大量阅读后 它现在看起来工作得很好 但我注意到由于错误的 Spring Security 配