spring aop 权限拦截
September 23, 2015
在云盘服务端 java 化的进程中,我们选择使用了在 header 中添加认证头信息的方式进行权限校验,这样就触发了一个问题,spring mvc 中如何完成这个认证过程。里面有一个难点就是如果请求 body 有业务内容,我们需要获取到里面的内容进行签名,最开始我们直接实现了一个 Interceptor 类,然后通过 preHandle 方法中的 HttpServletRequest 获取到了 body,然后进行签名计算,但是这样有问题,在 spring mvc 将 body 内容注入到 handler 参数之前我们人为的消费了里面的数据,导致如下 function 中 addGroup 参数为空,所以这个方法肯定不行。
解决办法:
接下来经过研究 spring 注入流程,发现这个办法,直接实现 spring 中的 MethodInterceptor 这个接口如下:
然后在 handler 函数上加入我们自定义好的注解类即可:
这里面的原理是,这个会 MethodInterceptor 在函数被注入后执行之前进行触发,这样我们只需要做好一些约定,就可以使用这个注解完成我们的权限验证的问题,从而避免 body 被提前消费。
最后别忘在配置文件中进行实现如下配置,让 spring 容器加载这个拦截器
<bean id="accessRequiredInterceptor" class="com.xxx.xm.mbox.interceptors.AccessRequiredInterceptor"/>
从上面这个事情上不难看出,spring mvc 基于 spring 构建的,整个请求生命周期过滤可以在 mvc 中进行,也可以借助 spring 本身的 aop 进行拦截。后者明显更底层一些
阅读量
Written by xi ming You should follow him on Github