在一些业务场景中,需要对http的请求体和响应体做加解密的操作,如果在controller中来调用加解密函数,会增加代码的耦合度,同时也会增加调试的难度。
参考spring中http请求的链路,选择过滤器来对请求和响应做加解密的调用。只需要在过滤器中对符合条件的url做拦截处理即可。
一般在过滤器中修改请求体和响应体,以往需要自行创建Wrapper包装类,从原请求Request对象中读取原请求体,修改后重新放入新的请求对象中等等操作……非常麻烦。如果可以在过滤器中只定义加解密的函数,然后调用一个API传入这些加解密函数,中间操作统统不管,这样用起来岂不是更爽!
新增注解@ServletComponentScan
使用步骤:
Filter
接口。@WebFilter
注解指定拦截的url,可以配置多个url。处理逻辑
函数中使用的请求包装类ModifyRequestBodyWrapper
和响应包装类ModifyResponseBodyWrapper
在文末附录中贴出,可以直接copy到项目工程中使用。
以上就是以往的处理方式;对于过滤器中的处理逻辑,如果项目中做不同的加解密每次都要这样去实现,未免有些冗余。
重新分析不难发现在过滤器中的处理逻辑始终都是不变的,对于不同的加解密方式只有加解密函数是变化的。为此可以引入函数式编程的方式,对于处理逻辑进行封装,每次只需要定义不同的加解密函数然后调用封装好的API即可。
改进后的过滤器
modifyHttpData
函数有另外的重载,支持修改Content-Type
。HttpUtil
也在文末附录中贴出,直接copy到项目工程中使用。
对于函数式编程不熟悉的同学可以去学习下Java中如何使用 lambda
表达式和Java的几种内置的函数接口(JDK1.8版本及以上才支持);上面的lambda
表达式其实是一种简写的方式,还可以用其最一般化的方式来表示。
请求包装类
响应包装类
HttpUtil封装工具类