假设有一条消息:"大家好!我是王尼玛:),欢迎收看尼玛直播。<script>一个傻B的经常犯的错误,系统不正常。"
笑脸需要被替换,script脚本也需要被替换,“系统”、“傻B”等敏感词也得被替换,那么我们应该如何处理这样的需求呢?
简单的实现:
在确定的过滤规则上,我们可以这样实现,但我们想要的结果是,将来这条信息可以动态添加或删除一些未知的过滤条件,并且支持排序,那么又该如何处理呢?
1、假如第一个过滤条件是将script脚本标签改成正常的文本内容,那么我们可以这么设计。
2、第二个过滤规则,敏感字眼去掉(可以读取一张字眼配置表,查询需要过滤的字眼)。
从上面代码发现,虽然加了多个过滤器,但仍然无法动态添加过滤条件,因此我们可以添加一个容器存储这些过滤器,允许添加和修改这些过滤条件,而这些过滤器形成一条链,叫做责任链。
3、假设原本的设计有一条已知的过滤链,然后我要在敏感过滤器和笑脸过滤器之间加上一条新的过滤链,那么怎么解决这种问题呢?
4、如果请求request和响应response都需要共用一条过滤链,并且过滤顺序是先进后出,那么该如何实现这样的需求呢?
public interface Filter {
/**
* 过滤接口
* @param msg
* @return
*/
void doFilter(Request request, Response response, FilterChain fc);
}
public class FilterChain implements Filter {
private List<Filter> filters = new ArrayList<Filter>();
private int index = 0;
public FilterChain addFilter(Filter filter) {
filters.add(filter);
return this;
}
public FilterChain removeFilter(Filter filter) {
filters.remove(filter);
return this;
}
public void doFilter(Request request, Response response, FilterChain fc) {
if (index == filters.size()) return;
Filter f = filters.get(index);
//此处index++必须放到doFilter上面,代表每次执行的是下一个doFilter
//否则每次执行的是自己本身,导致死循环
index++;
f.doFilter(request, response, fc);
}
}
public class HTMlFilter implements Filter {
public void doFilter(Request request, Response response, FilterChain fc) {
// TODO Auto-generated method stub
request.setReqStr(request.getReqStr().replace("<", "[")
.replace(">", "]") + "--->>>(req):html<<<---");
// response.setResStr(response.getResStr().replace("<", "[")
// .replace(">", "]"));
fc.doFilter(request, response, fc);
response.setResStr(response.getResStr() + "--->>>(res):html<<<---");
}
}
public class SensitiveFilter implements Filter {
public void doFilter(Request request, Response response, FilterChain fc) {
request.setReqStr(request.getReqStr().replace("傻B", "**")
.replace("系统", "**") + "--->>>(req):sensitive<<<---");
// response.setResStr(response.getResStr().replace("傻B", "**")
// .replace("系统", "**"));
fc.doFilter(request, response, fc);
response.setResStr(response.getResStr() + "--->>>(res):sensitive<<<---");
}
}
public class SpaceFilter implements Filter{
public void doFilter(Request request, Response response, FilterChain fc) {
request.setReqStr(request.getReqStr().replace(":)", "☺") + "--->>>(req):space<<<---");
// response.setResStr(response.getResStr().replace(":)", "☺"));
fc.doFilter(request, response, fc);
response.setResStr(response.getResStr() + "--->>>(res):space<<<---");
}
}
public class Main {
public static void main(String[] args) {
String msg = "大家好!我是王尼玛:),欢迎收看尼玛直播。<script>一个傻B的经常犯的错误,系统不正常。";
Request request = new Request();
request.setReqStr(msg);
Response response = new Response();
response.setResStr("response");
FilterChain fc = new FilterChain()
.addFilter(new HTMlFilter())
.addFilter(new SensitiveFilter())
.addFilter(new SpaceFilter());
fc.doFilter(request, response, fc);
System.out.println(request.getReqStr());
System.out.println(response.getResStr());
}
}
最终输出结果:
大家好!我是王尼玛☺,欢迎收看尼玛直播。[script]一个**的经常犯的错误,**不正常。--->>>(req):html<<<------>>>(req):sensitive<<<------>>>(req):space<<<---
response--->>>(res):space<<<------>>>(res):sensitive<<<------>>>(res):html<<<---