java—springboot中jwt令牌和requestbody参数的验证

gijlo24d  于 2021-10-10  发布在  Java
关注(0)|答案(1)|浏览(380)

我有一个React式spring启动应用程序,其中我有不同的控制器,所有控制器都有get、post、put、delete方法get和delete方法uri format=>/{username}/{others},并且确保put和post方法在其请求体中必须有一个字段userid。还有所有具有授权标头的请求。
我已经有了一个名为validate的方法,它接受两个参数authorizationheader和username,如果这个Map存在,则返回true,否则返回false。
我正在尝试编写通用过滤器,可以过滤传入的请求,并在进入控制器之前进行验证。
如何编写这个通用webfilter,特别是如何从post请求中提取正文并验证请求。
我试着写这个

@Component
@Slf4j
public class ExampleWebFilter implements WebFilter {
@Override
    public Mono<Void> filter(ServerWebExchange serverWebExchange, WebFilterChain webFilterChain) {

        ObjectMapper mapper = new ObjectMapper();

        return serverWebExchange
                .getRequest()
                .getBody()
                .next()
                .flatMap(body -> {
                    try {
                        return validate(body, serverWebExchange
                .geHeaders().get(0))
                    } catch (IOException e) {
                        return Mono.error(e);
                    }
                })
                .flatMap((boolean s) -> {
                    return webFilterChain.filter(serverWebExchange);
                });
    }

    Mono<Boolean> validate(DataBuffer body, String Header){

    //my logic to validate 

    }

    }

但在这个过滤方法执行之后,它似乎挂起了。所以我的问题是
如何编写webfilter来读取正文并进行验证?
对于spring boot中的此类问题,还有其他通用解决方案吗?

ndh0cuux

ndh0cuux1#

我认为你应该使用拦截器。您可以拦截http调用,并对请求进行验证。您可以以全局方式执行此操作,也可以对特定端点/路径执行此操作。这是一个你的例子。

@Component
public class ProductServiceInterceptor implements HandlerInterceptor {
   @Override
   public boolean preHandle(
      HttpServletRequest request, HttpServletResponse response, Object handler) throws 
      Exception {

      return true;
   }
   @Override
   public void postHandle(
      HttpServletRequest request, HttpServletResponse response, Object handler, 
      ModelAndView modelAndView) throws Exception {
      //make validations 
    }

   @Override
   public void afterCompletion(HttpServletRequest request, HttpServletResponse response, 
     Object handler, Exception exception) throws Exception {
      //make validations
   }
}

在此之后,您需要像下面这样注册您的拦截器。

@Component
public class ProductServiceInterceptorAppConfig extends WebMvcConfigurerAdapter {
   @Autowired
   ProductServiceInterceptor productServiceInterceptor;

   @Override
   public void addInterceptors(InterceptorRegistry registry) {
      registry.addInterceptor(productServiceInterceptor);
   }
}

欲了解更多详细信息,请访问以下链接。
https://www.youtube.com/watch?v=agbadiax0wc
https://www.tutorialspoint.com/spring_boot/spring_boot_interceptor.htm

相关问题