写这篇博文是想记录以下的业务场景。
笔者就职一家传统的软件公司,公司大部分的项目架构都是spring、springMVC、springJdbc、restEasy等技术。
当时的需求是用户通过前段页面创建数据采集任务,数据采集任务在后台执行爬取流经中心交换机流量。然后通过流量比对我方提供的威胁情报生成告警信息。
拿到需求的第一反应就想到了springMVC的拦截器,拦截用户创建的数据采集任务,在拦截了数据采集任务创建成功之后,后台开始执行比对过程。但是在编码的时候发springMVC的拦截器和restEasy不兼容,无奈之下选择了过滤器,如果大家有更好的实现方式请不吝赐教。
1、第一步
自定义过滤器类CustomFilter实现Filter接口;
public class CustomFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
ResponseWrapper wrapperResponse = new ResponseWrapper((HttpServletResponse)response);
chain.doFilter(request, wrapperResponse);
byte[] content = wrapperResponse.getContent();
if(content.length > 0) {
String str = new String(content, "UTF-8");
JsonObject fromJson = new Gson().fromJson(str, JsonObject.class);
if(fromJson.get("status").toString().equals("200")) {
//do something
}
}
}
@Override
public void destroy() {
}
}
上面的代码中ResponseWrapper类继承HttpServletResponseWrapper类,重写ServletOutputStream()、flushBuffer()方法,以此方式获取创建采集任务的返回值。
public class ResponseWrapper extends HttpServletResponseWrapper {
private ByteArrayOutputStream buffer;
private ServletOutputStream out;
public ResponseWrapper(HttpServletResponse httpServletResponse) {
super(httpServletResponse);
buffer = new ByteArrayOutputStream();
out = new WrapperOutputStream(buffer);
}
@Override
public ServletOutputStream getOutputStream() throws IOException {
return out;
}
@Override
public void flushBuffer() throws IOException {
if (out != null) {
out.flush();
}
}
public byte[] getContent() throws IOException {
flushBuffer();
return buffer.toByteArray();
}
class WrapperOutputStream extends ServletOutputStream {
private ByteArrayOutputStream bos;
public WrapperOutputStream(ByteArrayOutputStream bos) {
this.bos = bos;
}
@Override
public void write(int b) throws IOException {
bos.write(b);
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setWriteListener(WriteListener arg0) {
}
}
}
然后判定返回值状态是200表示创建成功,然后开启线程任务执行流量比对。
2、第二部
web.xml过滤器的配置
<filter>
<filter-name>customFilter</filter-name>
<filter-class>com.xxx.Filter.CustomFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>customFilter</filter-name>
<url-pattern>/ws/taskAdd</url-pattern>
</filter-mapping>
到此基本实现了拦截功能。