自定义过滤器(Filter), 获取返回值

写这篇博文是想记录以下的业务场景。

笔者就职一家传统的软件公司,公司大部分的项目架构都是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过滤器的配置

   
		customFilter
		com.xxx.Filter.CustomFilter
	
	
		customFilter
		/ws/taskAdd
	

到此基本实现了拦截功能。

你可能感兴趣的:(Java)