मैं स्प्रिंग एमवीसी का उपयोग कर रहा हूं @ControllerAdvice
और @ExceptionHandler
बाकी एप्टी के सभी अपवादों को संभालने के लिए। यह वेब mvc नियंत्रकों द्वारा फेंके गए अपवादों के लिए ठीक काम करता है, लेकिन यह वसंत सुरक्षा कस्टम फ़िल्टर द्वारा फेंके गए अपवादों के लिए काम नहीं करता है क्योंकि वे नियंत्रक विधियों को लागू करने से पहले चलाते हैं।
मेरे पास एक कस्टम स्प्रिंग सिक्योरिटी फ़िल्टर है जो एक टोकन आधारित स्थिति करता है:
public class AegisAuthenticationFilter extends GenericFilterBean {
...
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
try {
...
} catch(AuthenticationException authenticationException) {
SecurityContextHolder.clearContext();
authenticationEntryPoint.commence(request, response, authenticationException);
}
}
}
इस कस्टम प्रविष्टि बिंदु के साथ:
@Component("restAuthenticationEntryPoint")
public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint{
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authenticationException) throws IOException, ServletException {
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, authenticationException.getMessage());
}
}
और विश्व स्तर पर अपवादों को संभालने के लिए इस वर्ग के साथ:
@ControllerAdvice
public class RestEntityResponseExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler({ InvalidTokenException.class, AuthenticationException.class })
@ResponseStatus(value = HttpStatus.UNAUTHORIZED)
@ResponseBody
public RestError handleAuthenticationException(Exception ex) {
int errorCode = AegisErrorCode.GenericAuthenticationError;
if(ex instanceof AegisException) {
errorCode = ((AegisException)ex).getCode();
}
RestError re = new RestError(
HttpStatus.UNAUTHORIZED,
errorCode,
"...",
ex.getMessage());
return re;
}
}
वसंत सुरक्षा प्रमाणीकरण के लिए भी मुझे एक विस्तृत JSON निकाय वापस करने की आवश्यकता है। वहाँ एक तरीका है वसंत सुरक्षा बनाने के लिए AuthenticationEntryPoint और स्प्रिंग mvc @ExceptionHandler एक साथ काम करते हैं?
मैं वसंत सुरक्षा 3.1.4 और वसंत mvc 3.2.4 का उपयोग कर रहा हूं।
(@)ExceptionHandler
केवल तभी काम करेगा जब अनुरोध द्वारा नियंत्रित किया जाएगाDispatcherServlet
। हालांकि यह अपवाद इससे पहले होता है क्योंकि इसे ए द्वारा फेंक दिया जाता हैFilter
। तो आप इस अपवाद को कभी नहीं संभाल पाएंगे(@)ExceptionHandler
।