java filter过滤器,异步如何处理过滤器?

TheDisguiser 2020-08-10 10:47:32 java常见问答 6421

java中因为权限的限制,我们项目里一般都会加上filter过滤器,然而当过滤器处理时占用时间较长的话就会一直占用一个web容器线程,这样是不行的,异步处理的话就可以解决这个问题,本篇文章就来看看如何异步处理过滤器。

异步过滤器配置:

需要设置@WebFilter的属性asyncSupport属性的值为true或在filter标签里使用async-supported标签进行设置。

示例:

@WebFilter(urlPatterns = "*", asyncSupported = true)
public class Filter1 implements Filter
{
    @Override
    public void destroy()
    {
        // TODO Auto-generated method stub
    }
    private ExecutorService service = Executors.newCachedThreadPool(); //提高线程的创建性能
    @Override
    public void doFilter(ServletRequest req, ServletResponse arg1
        , FilterChain chain) throws IOException, ServletException
    {
        final AsyncContext context = req.startAsync(); //得到异步上下文
        service.submit(new AsyncRequest(context)); //这样以线程池的方式来处理,在doFilter中就很简洁了
        //      context.start(new Runnable(){
        //
        //          @Override
        //          public void run() {
        //              try {
        //                  Thread.sleep(3000);
        //              } catch (InterruptedException e) {
        //                  e.printStackTrace();
        //              }
        //              System.out.println("AsyncFilter Done!");
        //              context.complete();
        //          }
        //          
        //      });
        System.out.println("Filter Done!");
        chain.doFilter(req, arg1);
    }
    @Override
    public void init(FilterConfig arg0) throws ServletException
    {
        // TODO Auto-generated method stub
    }
    class AsyncRequest implements Runnable
    { //线程类
        private AsyncContext context;
        public AsyncRequest(AsyncContext context)
        { //构造方法
            this.context = context;
        }
        @Override
        public void run()
        { //具体的业务
            try
            {
                Thread.sleep(3000);
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
            System.out.println("AsyncFilter Done!");
            context.complete();
        }
    }
}

PS:在实际中处理异步请求中,无论Servlet或Filter其实都不是最好选择,只有监听器在这样的工作中是爸爸。

以上就是本篇文章的所有内容,深入了解过滤器对项目的编写是很有帮助的,更多java面试常见问题快关注本站了解具体。

推荐阅读:

filter过滤器是什么?Filter功能有哪些?