Spring Boot中filter的使用详解及原理( 二 )


我们也可以在print("before:" + response)和print("after:" + response)这两个地方打上断点 , 然后调试一下 , 你会发现在before那里的response里是什么都么有的 , 而在after那里的response里则是已经有了test1字符串 , 也就是说controller类test1方法的返回值已经添加进了response , 所以如果你想对请求的response做一下过滤处理 , 那么一定要在chain.doFilter(res, rep)之后写你的逻辑 。
接下来讲一下这个Filter和FilterChain都是怎么用责任链模式实现的 , 如果不太需要了解原理的话 , 往下的部分就可以不看了 。。。 好了 , 我们来模拟一下简单的实现SpringBoot中的Filter接口和FilterChain类:
首先是我们自己写的Filter接口 , 里边就一个doFilter方法:
package filterchain_pattern;public interface Filter {public void doFilter(Request request, Response response, FilterChain chain);}接下来是我们自己写的FilterChain类:
package filterchain_pattern;import java.util.ArrayList; import java.util.List;public class FilterChain implements Filter {private List filters = new ArrayList<>(); int index = 0;public FilterChain addFilter(Filter filter) { filters.add(filter); return this; }@Override public void doFilter(Request request, Response response, FilterChain chain) {if(index == filters.size()) { return; } Filter filter = filters.get(index); index++; filter.doFilter(request, response, chain); }}接下来模拟Request类和Response类:
package filterchain_pattern;public class Request {public String requestStr;}package filterchain_pattern;public class Response {public String responseStr;}然后我们下一个Filter接口的实现类HTMLFilter类 , 该类会将requestStr中的<>替换成[] , 并给responseStr添加------------HTML response filter字符串 , 并在控制台打印出来:
package filterchain_pattern;public class HTMLFilter implements Filter {@Override public void doFilter(Request request, Response response, FilterChain chain) { request.requestStr = request.requestStr.replace("<", "[").replace(">", "]") + "--------HTML Request Filter"; System.out.println("HTML Filter request Str:" + request.requestStr); chain.doFilter(request, response, chain); response.responseStr = response.responseStr + "-------------HTML response filter"; System.out.println("HTML Filter response Str:" + response.responseStr); } }然后是另外一个Filter接口的实现类SensitiveFilter类 ,该类会给requestStr添加一段字符串 , 给responseStr添加一段字符串 , 并在控制台打印出来:
package filterchain_pattern;public class SensitiveFilter implements Filter {@Override public void doFilter(Request request, Response response, FilterChain chain) { request.requestStr = request.requestStr + "---------------Sensitive request Filter"; System.out.println("sensitiveFilter request str:" + request.requestStr); chain.doFilter(request, response, chain); response.responseStr = response.responseStr + "---------------------sensitive response filter"; System.out.println("sensitiveFilter response str:" + response.responseStr); }}最后使我们的Main方法类:
package filterchain_pattern;public class MainTest {public static void main(String[] args) {String msg = "testMsg"; Request request = new Request(); request.requestStr = msg; Response response = new Response(); response.responseStr = "responseStr";FilterChain fc = new FilterChain(); fc.addFilter(new HTMLFilter()).addFilter(new SensitiveFilter()); fc.doFilter(request, response, fc);}}打印结果如下 , 这就是责任链模式的实际应用了:
Spring Boot中filter的使用详解及原理文章插图