做接口的权限控制,接口请求结构是JSON串,比较为难的是@RequestBody的获取
网上的资料是先手动读出来,再使用自定义的封装将JSON串写回去
感觉有点麻烦,使用了新的思路
在拦截器中,拦截需要做权限验证的请求,使用下面的方式,将权限校验跳转到Controller层中做
String uri = request.getRequestURI();
request.setAttribute("referenceUrl", uri);
request.getRequestDispatcher(checkerUrl).forward(request, response);
url是用来校验权限的Controller路径
在Controller中可以使用@RequestBody注解拿到请求body,
之后可以使用获取到的body信息校验权限,
校验通过的,获取uri
再次通过如下方式,跳转到真正要请求的Controller层
request.getRequestDispatcher(uri).forward(request, response);
注意,这里会有拦截器死循环的问题,当然 因为@RequestBody只能读一次的特性,在第二次被拦截器拦截时就会因为请求Body为空抛异常。再当然 如果你不幸的设置了@RequestBody注解required属性为false,即允许为空 那么就真的陷入无限循环了
所以,这里我们要给request加一个标志,表明经过了该过滤器,一旦标志不为空则直接返回true 允许请求通过
if (null != flag) {
return true;
}
/*
*我想你不会将上面的代码写到拦截器后面的对吧
*
*一定要将上面的代码加到拦截器一开始的地方
*也不要忘记 后续设置