背景
在解决项目权限管理的过程中,原项目使用httpServletRequest.getRequestURI()
获取请求的uri去进行鉴权,但是这样在有路径变量的时候,过程就变得复杂起来,可能需要采用正则去解决这个问题。
思考
既然SpringMVC能够帮我们匹配的可以执行的方法,那么通过反射获取到相应的匹配路径,例如@GetMapping("/users/{sysUserId}")
,那么我们就可以保证鉴权的uri
和数据库中存放的uri
一致了,不需要正则去匹配。
解决方法
1、发送请求
浏览器发送以下请求http://localhost:8080/glive/tasks/web/3
,正常通过httpServletRequest.getRequestURI()
获取URI为/glive/tasks/web/3
。这不能够具有标准性,如果我改变为/glive/tasks/web/4
,那么鉴权就变得复杂起来了。
2、拦截器获取匹配HandlerMethod的路径
在拦截器的preHandle
方法中
String path = null;
if(o instanceof HandlerMethod){
RequestMapping mapping = ((HandlerMethod) o).getMethodAnnotation(RequestMapping.class); // 获取方法上的注解
RequestMapping mappingClass = ((HandlerMethod) o).getBeanType().getAnnotation(RequestMapping.class); // 获取类的注解
if(mapping == null || mappingClass == null)
return false;
path = mappingClass.value()[0] + mapping.value()[0];
}
那么得到的路径path
就变为/glive/tasks/web/{taskId}
,这时,就可以直接用该path去鉴权了!!