业务需求
改造系统中的原先写的通过表达式拦截实现的鉴权功能。
原有逻辑
没有注释(啊啊啊啊)。
花费工时7.5小时。
步骤如下:
- 获取Header头参数。
- 校验Header头的必要参数。
- 通过Header中获取的参数,查询数据库入口表信息。
- 通过Header中获取的参数,尝试进行验签。
实现过程
前期分析
由于需要打印前后日志,所有使用环绕通知实现,又需要基于注解可能要给其他服务使用,使用注解比表达式更灵活。
难点1
由于要前后打印日志,但是接口时通过POST方式接收,涉及到读取Body数据,可Web中的Body只能读取一次,故这是个问题点。
解决方案
SpringMVC中也会涉及到重复读写Body的情况,可以查看Spring中是否已经实现,果然ContentCachingRequestWrapper这个类解决了我们的难题。
难点2
如何把包装后的Request放回去让,Spring其他功能继续处理呢。
解决方案:还是考虑SpringMVC中是否有实现,RequestContextHolder类中**RequestContextHolder.setRequestAttributes();**方法解决这个问题。通过测试可行。
难点3
第3步,要访问数据库获取入口信息,如果以公用模块的方式提供其他服务使用,需要提供灵活的方法。
解决方案:采用桥接模式,实现与抽象分离,让代码变的灵活。