# http-plus **Repository Path**: ccuts/http-plus ## Basic Information - **Project Name**: http-plus - **Description**: 对HttpFilter的增强,可以通过添加模块来实现相应功能,支持自定义扩展 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2021-09-28 - **Last Updated**: 2021-09-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # http-plus #### 介绍 http-plus 是一个在增强型Filter , 他在一个普通的Filter上创建了一个处理链的机制,使用者可以通过扩展请求处理器(RequestHandler)对原始的HttpServletRequest进行扩展,比如过滤url、日志打印、修改请求体、对请求体进行解签,认证 等等扩展(发挥你的想象力) #### 使用说明 1. 使用者可以创建一个类 继承于 AbstractRequestHandler,以打印日志的代码来说明,需要用户自己实现isSupport 和handler方法 ,如果isSupport 为false 那么handler方法将不执行 ``` @Slf4j @Component public class LogRequestHandler extends AbstractRequestHandler { @Value("${http.plus.log.enable:false}") private boolean enable; @Override public boolean isSupport() { return enable; } @Override public void handler(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) { log.info("nnn"); } } ``` 2. @Component 不是必须的 ,这里仅仅用作属性注入 , 重写方法后 有两种方式 把请求处理器加载到处理链中 (1) core包中resources目录下 services -> com.boolib.http.core.face.handler.RequestHandler 文件中添加 自己创建的请求处理器的完全限定名 (2)通过调用ChainUtil.addRequestHandler()方法把处理器添加到链中 例子1 ``` 文件com.boolib.http.core.face.handler.RequestHandler 中添加 com.boolib.spi.DecryptBodyRequestHandler ``` 例子2 在任何初始化地方添加都可以 ``` @SpringBootApplication public class TestApplication { @PostConstruct public void init(){ ChainUtil.addRequestHandler(new DecryptBodyRequestHandler()); } public static void main(String[] args) { SpringApplication.run(TestApplication.class,args); } } ``` 3. 如果需要从ServletInputStream中修改请求数据,那么需要继承 AbstractHttpRequestReusableStreamWrapper这个类 ,并且重写changeData的方法。 继承AbstractHttpRequestReusableStreamWrapper抽象类的自定义StreamWrapper会在实例化时调用抽象类的构造方法, 并且读取出ServlertInputStream流中的数据存在变量 decodeStreamData中(用户不需要关系ServletInputStream流只能读一次的问题) ,所以在子类中可以 直接通过decodeStreamData获取byte数组 。需要修改的数据填充到changeData方法中就可以实现请求体的替换 例子1 ``` public class DecryptBodyRequestHandler extends AbstractRequestHandler { @Override public boolean isSupport() { return !("get".equalsIgnoreCase(httpServletRequest.getMethod()) || httpServletRequest.getContextPath().contains("internal") || "application/form-data".equalsIgnoreCase(httpServletRequest.getContentType())); } @Override public void handler(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) { DecryptBodyRequestWrapper decryptBodyRequestWrapper = null; try { decryptBodyRequestWrapper = new DecryptBodyRequestWrapper(httpServletRequest); } catch (IOException e) { e.printStackTrace(); } this.httpServletRequest = decryptBodyRequestWrapper; this.httpServletResponse = httpServletResponse; } } ``` 例子2 重写 DecryptBodyRequestWrapper 方法 ``` protected byte[] changeData(){ return this.decodeStreamData; } ``` #### 其他 : 待续