如java servlet规范所指定,Filter
总是在Servlet
调用a之前执行。现在,a@ControllerAdvice
仅对在中执行的控制器有用DispatcherServlet
。因此,使用a Filter
并期望a@ControllerAdvice
或在这种情况下@ExceptionHandler
不会被调用。
您需要将相同的逻辑放入过滤器中(用于编写JSON响应),或者代替使用HandlerInterceptor
此检查的过滤器。最简单的方法是扩展HandlerInterceptorAdapter
和重写并实现该preHandle
方法,并将来自过滤器的逻辑放入该方法中。
public class ClientKeyInterceptor extends HandlerInterceptorAdapter {
@Value('${CLIENT_KEY}')
String clientKey
@Override
public boolean preHandle(ServletRequest req, ServletResponse res, Object handler) {
String reqClientKey = req.getHeader('Client-Key')
if (!clientKey.equals(reqClientKey)) {
throw new AccessForbiddenException('Invalid API key')
}
return true;
}
}