Ho un semplice filtro solo per verificare se una richiesta contiene un'intestazione speciale con chiave statica - nessuna autorizzazione utente - solo per proteggere gli endpoint. L'idea è di lanciare un AccessForbiddenException
se la chiave non corrisponde a quella che verrà mappata alla risposta con una classe annotata con @ControllerAdvice
. Tuttavia non posso farlo funzionare. Il mio @ExceptionHandler
non viene chiamato.Crea un semplice filtro servlet con @ControllerAdvice
ClientKeyFilter
import org.springframework.beans.factory.annotation.Value
import org.springframework.stereotype.Controller
import javax.servlet.*
import javax.servlet.http.HttpServletRequest
@Controller //I know that @Component might be here
public class ClientKeyFilter implements Filter {
@Value('${CLIENT_KEY}')
String clientKey
public void init(FilterConfig filterConfig) {}
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
req = (HttpServletRequest) req
def reqClientKey = req.getHeader('Client-Key')
if (!clientKey.equals(reqClientKey)) {
throw new AccessForbiddenException('Invalid API key')
}
chain.doFilter(req, res)
}
public void destroy() {}
}
AccessForbiddenException
public class AccessForbiddenException extends RuntimeException {
AccessForbiddenException(String message) {
super(message)
}
}
ExceptionController
@ControllerAdvice
class ExceptionController {
static final Logger logger = LoggerFactory.getLogger(ExceptionController)
@ExceptionHandler(AccessForbiddenException)
public ResponseEntity handleException(HttpServletRequest request, AccessForbiddenException e) {
logger.error('Caught exception.', e)
return new ResponseEntity<>(e.getMessage(), I_AM_A_TEAPOT)
}
}
Dove mi sbaglio? Un semplice filtro servlet funziona con la mappatura delle eccezioni di spring-boot?
Ciò non accadrà mai per un filtro. '@ ControllerAdvice' è utile solo per le richieste che raggiungono' DispatcherServlet', 'Filter's viene sempre eseguito prima. O metti quella logica nel filtro o invece di un filtro usa un 'HandlerInterceptor'. –
@ M.Deinum, ho finalmente usato 'HandlerInterceptor'. Se desideri aggiungerlo come risposta, sarò felice di accettarlo. – Opal