Servlets FIlterChain异常处理

Servlets FIlterChain异常处理,servlets,exception-handling,servlet-filters,Servlets,Exception Handling,Servlet Filters,我试图理解Spring安全性,它涉及方法安全性和基于URL的安全性。基于URL的安全性完全基于Servlet过滤器。当Spring security处理过滤器链抛出的异常以完成其工作时,会出现一些场景 我知道Servlet容器如何执行过滤器,但我特别感兴趣的是filterChain如何处理过滤器链中doFilter方法引发的异常 我特别感兴趣的是filterChain如何处理过滤器链中doFilter方法引发的异常 这与他们无关。换句话说,它只是让他们去泡泡。它们最终会出现在servletcon

我试图理解Spring安全性,它涉及方法安全性和基于URL的安全性。基于URL的安全性完全基于
Servlet过滤器
。当Spring security处理过滤器链抛出的异常以完成其工作时,会出现一些场景

我知道Servlet容器如何执行过滤器,但我特别感兴趣的是
filterChain
如何处理过滤器链中
doFilter
方法引发的异常

我特别感兴趣的是
filterChain
如何处理过滤器链中
doFilter
方法引发的异常

这与他们无关。换句话说,它只是让他们去泡泡。它们最终会出现在servletcontainer的内置异常处理程序中,该处理程序已经知道如何根据
web.xml
中的
配置来处理它们

但是,您可以通过将
FilterChain#doFilter()
调用放入
try catch
块来控制它,如下所示:

try {
    chain.doFilter(request, response) {
} catch (ServletException e) {
    Throwable cause = e.getRootCause(); 
    // ... (handle it)
}
如果链中的其他任何东西(过滤器、servlet、jsp等)抛出一个未捕获的异常,它将在那里结束

另见:
我特别感兴趣的是
filterChain
如何处理过滤器链中
doFilter
方法引发的异常

这与他们无关。换句话说,它只是让他们去泡泡。它们最终会出现在servletcontainer的内置异常处理程序中,该处理程序已经知道如何根据
web.xml
中的
配置来处理它们

但是,您可以通过将
FilterChain#doFilter()
调用放入
try catch
块来控制它,如下所示:

try {
    chain.doFilter(request, response) {
} catch (ServletException e) {
    Throwable cause = e.getRootCause(); 
    // ... (handle it)
}
如果链中的其他任何东西(过滤器、servlet、jsp等)抛出一个未捕获的异常,它将在那里结束

另见:

我认为在尝试/捕获doFilter方法时,您无法在HttpServletResponse流中的errorMessage中返回任何有意义的内容,除非您专门拦截HttpServletResponse流并调用sendError之类的调用。甚至在调用doFilter之前都必须这样做

我对filterChain如何处理异常特别感兴趣 由筛选器链中的doFilter方法引发


但我感兴趣的是,当filterChain中发生异常时,如何将有意义的响应发送回流中。因为即使没有例外,如果在doFilter(?)之前已经调用了sendError之类的方法,您将如何处理成功响应?我认为在尝试/捕获doFilter之类的方法时,您无法在HttpServletResponse流中的errorMessage中返回任何有意义的内容,除非您专门拦截HttpServletResponse流并调用sendError之类的东西。甚至在调用doFilter之前都必须这样做

我对filterChain如何处理异常特别感兴趣 由筛选器链中的doFilter方法引发


但我感兴趣的是,当filterChain中发生异常时,如何将有意义的响应发送回流中。因为即使没有异常,如果您在doFilter(?)之前已经调用了senderro之类的方法,您将如何处理成功响应

您的具体问题与Spring Security有什么关系?我只是好奇当Spring Security filter中的
SecurityFilterInterceptor
抛出
AuthenticationFailureException
时,
ExceptionTransltionFilter
SecurityFilterInterceptor
是如何工作的,
FilterChain
不处理异常。它没有任何内部
try-catch
块。它只是让他们离开。我只是很难理解为什么你会期望相反。是的,我知道,但是Spring安全文档说
ExceptionTranslationFilter
通过在try-catch块中包装filterChain来处理异常。这可能意味着,如果我有三个过滤器
Fliter1、Filter2、Filter3
,并且我将filterchain包装到
Filter2
中的try catch块中,那么
Filter3
中抛出的异常将在
Filter2
中被捕获,对吗?如果它们按此顺序调用,是的。通过创建一个小测试用例并观察它,您可以轻松地为自己确认它。我只是仍然不理解这个问题背后的基本原理。您的具体问题与Spring安全性有什么关系?我只是好奇当
securityFilterCeptor
在中抛出
AuthenticationFailureException
时,
ExceptionTransltionFilter
securityFilterCeptor
是如何工作的Spring security filter chainWell,
FilterChain
不处理异常。它没有任何内部
try-catch
块。它只是让他们离开。我只是很难理解为什么你会期望相反。是的,我知道,但是Spring安全文档说
ExceptionTranslationFilter
通过在try-catch块中包装filterChain来处理异常。这可能意味着,如果我有三个过滤器
Fliter1、Filter2、Filter3
,并且我将filterchain包装到
Filter2
中的try catch块中,那么
Filter3
中抛出的异常将在
Filter2
中被捕获,对吗?如果它们按此顺序调用,是的。通过创建一个小测试用例并观察它,您可以轻松地为自己确认它。我只是还是不明白这个问题背后的道理。我要找的正是——谢谢这条线,它让他们走了,然后冒了出来。它们最终会出现在servletcontainer的内置异常处理程序中,这让我非常清楚SpringSecurity过滤器链中的所有过滤器——这正是我想要的——感谢这一行,它让它们离开并冒泡了