Servlets FIlterChain异常处理
我试图理解Spring安全性,它涉及方法安全性和基于URL的安全性。基于URL的安全性完全基于Servlets FIlterChain异常处理,servlets,exception-handling,servlet-filters,Servlets,Exception Handling,Servlet Filters,我试图理解Spring安全性,它涉及方法安全性和基于URL的安全性。基于URL的安全性完全基于Servlet过滤器。当Spring security处理过滤器链抛出的异常以完成其工作时,会出现一些场景 我知道Servlet容器如何执行过滤器,但我特别感兴趣的是filterChain如何处理过滤器链中doFilter方法引发的异常 我特别感兴趣的是filterChain如何处理过滤器链中doFilter方法引发的异常 这与他们无关。换句话说,它只是让他们去泡泡。它们最终会出现在servletcon
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等)抛出一个未捕获的异常,它将在那里结束
另见:
但我感兴趣的是,当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过滤器链中的所有过滤器——这正是我想要的——感谢这一行,它让它们离开并冒泡了