我使用Spring Boot 2.3.8来创建rest服务。我有一个验证请求头部的要求,这样它就应该有一定的头部,否则就会抛出错误。这对于所有的方法或服务都应该是通用的。我在下面试过了,
public ResponseEntity<Object> addEmployee(
@RequestHeader(name = "header1", required = true) String header1,
@RequestHeader(name = "header2", required = true) String header2,
@RequestBody Employee employee)
throws Exception
{
但我需要为所有控制器中的所有方法添加此代码。如果是这种情况,我如何为全局所有服务抛出类似"Header1 missing in request headers“/ "header2 missing in request headers”的错误?
发布于 2021-03-14 03:39:57
这就是过滤器的用途。您希望根据头部是否存在来过滤请求,如果头部缺失,则返回错误。如果您不希望将OncePerRequestFilter
用于所有请求,则可以选择扩展shouldNotFilter
,或者您可以实现一个普通的Filter
并使用FilterRegistrationBean
仅为特定路径注册它。
然后,在过滤器中,您可以抛出一个异常,并让Spring确定如何显示该异常,或者实际将响应设置为有意义的内容。
发布于 2021-03-14 02:41:05
如果您有Zuul,那么您可以在预路由中读取请求头部属性,并在验证失败时回复填充了错误的请求。
发布于 2021-03-14 02:41:35
这是一个横切的关注点,应该使用AOP
完成。由于您使用的是Spring
,因此可以执行以下操作:
ValidateHeaderspublic @interface ValidateHeaders {}
的批注
@ValidateHeaders
注释的方法的@Before
通知:@Before("@annotation(com.somepackage.ValidateHeaders)") public void controllerProxy(JoinPoint jp) { Object[] args = jp.getArgs();//验证逻辑,验证失败抛出异常}
请注意,您必须使用反射提取字段,如下所示:
Annotation[][] pa = ms.getMethod().getParameterAnnotations();
您可以遍历所有注释并搜索请求头,如下所示:
if(annotations[i][j].annotationType().getName().contains("RequestHeader")) {
RequestHeader requestHeader = (RequestHeader) m.getParameterAnnotations()[i][j];
//now access fields in requestHeader to do the validation
}
这里有一篇文章可以让你开始使用建议类型:https://www.baeldung.com/spring-aop-advice-tutorial
https://stackoverflow.com/questions/66617128
复制相似问题