自定义过滤器(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过滤器的配置

   <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>

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值