前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在过滤器中修改http请求体和响应体

如何在过滤器中修改http请求体和响应体

作者头像
砒霜拌辣椒
发布2023-08-23 17:34:08
7240
发布2023-08-23 17:34:08
举报
文章被收录于专栏:HerculesHercules

在一些业务场景中,需要对http的请求体和响应体做加解密的操作,如果在controller中来调用加解密函数,会增加代码的耦合度,同时也会增加调试的难度。

参考spring中http请求的链路,选择过滤器来对请求和响应做加解密的调用。只需要在过滤器中对符合条件的url做拦截处理即可。

一般在过滤器中修改请求体和响应体,以往需要自行创建Wrapper包装类,从原请求Request对象中读取原请求体,修改后重新放入新的请求对象中等等操作……非常麻烦。如果可以在过滤器中只定义加解密的函数,然后调用一个API传入这些加解密函数,中间操作统统不管,这样用起来岂不是更爽!

1、启动类配置注解

新增注解@ServletComponentScan

2、过滤器实现

2.1、用Base64算法做加解密示例

使用步骤

  1. 实现Filter接口。
  2. 使用@WebFilter注解指定拦截的url,可以配置多个url。

处理逻辑

  1. 从servlet中读取原请求体(密文)。
  2. 调用解密函数获得明文。
  3. 构建新的请求对象,包装修改后的请求体(明文)。
  4. 构建新的响应对象,调用链调用应用层获得响应。
  5. 从新的响应对象中获得响应体(明文)。
  6. 调用加密函数对响应体进行加密。
  7. 用原响应对象的输出流,将加密后的密文响应体输出。

函数中使用的请求包装类ModifyRequestBodyWrapper和响应包装类ModifyResponseBodyWrapper在文末附录中贴出,可以直接copy到项目工程中使用。

3、测试验证

4、优化改进

以上就是以往的处理方式;对于过滤器中的处理逻辑,如果项目中做不同的加解密每次都要这样去实现,未免有些冗余。

重新分析不难发现在过滤器中的处理逻辑始终都是不变的,对于不同的加解密方式只有加解密函数是变化的。为此可以引入函数式编程的方式,对于处理逻辑进行封装,每次只需要定义不同的加解密函数然后调用封装好的API即可。

改进后的过滤器

  1. 只需要在过滤器上配置需要拦截的url列表、定义加解密函数然后调用封装好的API即可。
  2. 过滤器中不会改变请求和响应的字符集,都是沿用原来的。
  3. 只能针对于带有请求体的请求做加解密处理。
  4. 另外modifyHttpData函数有另外的重载,支持修改Content-Type

HttpUtil也在文末附录中贴出,直接copy到项目工程中使用。

对于函数式编程不熟悉的同学可以去学习下Java中如何使用 lambda 表达式和Java的几种内置的函数接口(JDK1.8版本及以上才支持);上面的lambda 表达式其实是一种简写的方式,还可以用其最一般化的方式来表示。

参考链接

代码地址

附录

请求包装类

响应包装类

HttpUtil封装工具类

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-06-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、启动类配置注解
  • 2、过滤器实现
    • 2.1、用Base64算法做加解密示例
    • 3、测试验证
    • 4、优化改进
    • 参考链接
    • 代码地址
    • 附录
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档