`
utopialxw
  • 浏览: 369873 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

servlet启用gzip过滤器后AsyncContext异步不成功的的问题

    博客分类:
  • web
阅读更多

看台湾林信良的《JSP&Servlet学习笔记第二版》5.4节异步处理时遇到的问题

异步处理的servlet若存在过滤器,则过滤器的注解@WebFilter应设置asyncSupported=true,

否则会报错A filter or servlet of the current chain does not support asynchronous operations.

但是启用了gzip压缩过滤器的话(也是本书中的例子)异步处理结果不显示

@WebServlet(name="AsyncServlet", urlPatterns={"/async.do"},
	asyncSupported=true
)
public class AsyncServlet extends HttpServlet {
	
	private ExecutorService executorService = Executors.newFixedThreadPool(10);
	
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			    throws ServletException, IOException{
		response.setContentType("text/html;charset=UTF-8");
		AsyncContext actx = request.startAsync();
		executorService.submit(new AsyncRequest(actx));
	}
	
	@Override
	public void destroy(){
		executorService.shutdown();
	}
}

 AsyncRequest代码如下

public class AsyncRequest implements Runnable {

	private AsyncContext actx;
	
	public AsyncRequest(AsyncContext actx){
		this.actx = actx;
	}
	
	@Override
	public void run() {
		try {
			Thread.sleep(5000);
			PrintWriter out = actx.getResponse().getWriter();
			out.println("久等了。。。。这是异步执行的结果");
			out.close();
			actx.complete();
		} catch (Exception e) {
			 e.printStackTrace();    
		}
	}

}

 CompressionFilter如下

/*@WebFilter(filterName="CompressionFilter", urlPatterns={"/*"},
	asyncSupported=true
)*/
public class CompressionFilter implements Filter {
    public void init(FilterConfig filterConfig) {}

    public void doFilter(ServletRequest request,
                              ServletResponse response,
                            FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;

        String encodings = req.getHeader("accept-encoding");
        if ((encodings != null) && (encodings.indexOf("gzip") > -1)) {
            CompressionWrapper responseWrapper =
                    new CompressionWrapper(res);
            responseWrapper.setHeader("content-encoding", "gzip");

            chain.doFilter(request, responseWrapper);

            GZIPOutputStream gzipOutputStream =
                    responseWrapper.getGZIPOutputStream();
            if (gzipOutputStream != null) {
                gzipOutputStream.finish();
            }
        }
        else {
            chain.doFilter(request, response);
        }
    }

    public void destroy() {}
}

 wrapper代码如下

public class CompressionWrapper
                            extends HttpServletResponseWrapper {
    private GZipServletOutputStream gzServletOutputStream;
    private PrintWriter printWriter;

    public CompressionWrapper(HttpServletResponse resp) {
        super(resp);
    }

    @Override
    public ServletOutputStream getOutputStream() throws IOException {
        if(printWriter != null) {
            throw new IllegalStateException();
        }
        if (gzServletOutputStream == null) {
            gzServletOutputStream = new GZipServletOutputStream(
                    getResponse().getOutputStream());
        }
        return gzServletOutputStream;
    }

    @Override
    public PrintWriter getWriter() throws IOException {
        if(gzServletOutputStream != null) {
            throw new IllegalStateException();
        }

        if (printWriter == null) {
            gzServletOutputStream = new GZipServletOutputStream(
                     getResponse().getOutputStream());
            OutputStreamWriter osw = new OutputStreamWriter(
                      gzServletOutputStream,
                      getResponse().getCharacterEncoding());
            printWriter = new PrintWriter(osw);
        }
        return printWriter;
    }

    @Override
    public void setContentLength(int len) {}

    public GZIPOutputStream getGZIPOutputStream() {
        if (this.gzServletOutputStream == null) {
            return null;
        }
        return this.gzServletOutputStream.getGzipOutputStream();
    }
}

 当然,我还启用了其他几个filter,asyncSupported都设置为true,其他的过滤器都没问题,只有加上这个gzip过滤器(去掉@webfilter注解的注释),请求async.do不能正确响应,后台也不报错 

不知道什么原因,记录下 以后解决

 

 

分享到:
评论

相关推荐

    servlet过滤器实例经典过滤器

    Servlet过滤器是Java Web开发中的一个重要组件,它允许开发者在请求到达Servlet之前或者响应离开Servlet之后进行拦截处理。本教程将深入讲解如何配置和使用Servlet过滤器,以及介绍五个经典的过滤器实例。 首先,让...

    Servlet过滤器的简单使用源码+文档

    在标题"Servlet过滤器的简单使用源码+文档"中,我们可以理解为这个压缩包包含了一个关于Servlet过滤器的基础应用示例,以及相关的源代码和文档资料。描述中提到的"实现一个登陆界面",表明了过滤器可能被用作验证...

    jsp+servlet登录验证过滤器

    在这个项目中,“jsp+servlet登录验证过滤器”涉及了用户登录验证的过程,以及使用过滤器(Filter)来实现这一功能。下面将详细介绍这个主题中的相关知识点。 1. **JSP**:JSP是一种服务器端的技术,允许开发者在...

    servlet 过滤器做的简单登陆demo

    Servlet过滤器是Java Web开发中的一个重要概念,它允许开发者在请求到达目标Servlet之前或之后对请求和响应进行处理。在这个“servlet过滤器做的简单登陆demo”中,我们将探讨如何利用过滤器实现一个基础的登录验证...

    servlet过滤器实现(Eclipse工程)

    Servlet过滤器是Java Web开发中的一个重要概念,它允许开发者在请求到达Servlet之前或者响应离开Servlet之后进行拦截处理。本教程将详细介绍如何在Eclipse环境中创建并实现一个Servlet过滤器。 一、Servlet过滤器...

    基于servlet的过滤器

    在这个小型的基于Servlet的过滤器项目中,我们主要关注如何利用过滤器来实现对网站访问用户的计数功能。这个功能在很多网站统计分析中都非常常见,可以帮助我们了解网站的流量情况。 首先,我们要理解Servlet过滤器...

    servlet四个有用的过滤器

    在Java Web开发中,`Servlet`过滤器是一种特殊的功能组件,可以在请求到达目标资源(如Servlet或JSP页面)之前进行预处理,也可以在响应发送到客户端之前进行后处理。它们可以用于实现跨切面的需求,比如统一设置...

    servlet过滤器验证用户登录

    在IT领域,特别是Java Web开发中,Servlet过滤器(Filter)是实现用户权限管理、登录状态验证等关键功能的重要机制之一。本文将深入探讨如何利用Servlet过滤器来验证用户是否已登录,以及如何配置过滤器以针对特定的...

    servlet过滤器解决乱码问题

    ### Servlet过滤器解决乱码问题 在Web应用开发过程中,字符编码问题经常出现,尤其是在处理中文等多字节字符时。如果不正确地设置字符编码,可能会导致页面显示乱码。本文将详细介绍如何通过Servlet过滤器来解决这...

    异步servlet

    这个对象可以用来注册监听器,以便在异步操作完成后接收通知,或者通过`AsyncContext.dispatch()`方法将请求分派到其他资源(如URL、Servlet)。 异步Servlet的生命周期包括以下几个关键步骤: 1. **启动异步**:...

    Servlet编码过滤器的实现

    总结一下,Servlet编码过滤器的作用是统一处理请求和响应的编码,防止因为编码不一致导致的乱码问题。实现编码过滤器需要实现`Filter`接口,并在`web.xml`中配置。在实际开发中,我们可以根据需求自定义过滤器的逻辑...

    java中servlet文字过滤器

    总结来说,"java中servlet文字过滤器"是Java Web开发中的一个重要工具,它提供了对HTTP请求和响应的预处理和后处理能力,尤其在处理编码问题和安全过滤方面起到了关键作用。通过合理配置和实现,Filter可以帮助我们...

    servlet过滤器详解

    Servlet过滤器,作为Java Servlet规范中的一个重要组成部分,自2.3版本起被引入,主要用于在Servlet容器中对请求和响应进行预处理和后处理。它不直接生成请求或响应,而是作为一个中间件存在,能够在请求到达目标...

    servlet过滤器技术实例,

    Servlet过滤器是Java Web开发中的一个重要概念,它允许开发者在请求到达Servlet之前或者Servlet响应返回客户端之前进行拦截处理。在本实例中,我们将深入探讨Servlet过滤器(Filter)的使用和实现,以及它在实际应用...

    Servlet过滤器小实例

    因此,使用Servlet过滤器(Filter)来处理这类问题成为了一种更加优雅的解决方案。 #### 实例目标 本实例的目标是设计并实现一个简单的Servlet过滤器,用于检查用户的登录状态。具体来说,当用户通过正常的登录...

    [转]Servlet3特征 异步Servlet

    要实现异步Servlet,你需要在Servlet类上使用`@.WebServlet(asyncSupported = true)`注解来启用异步支持,并在`service()`方法或`doGet()`、`doPost()`等方法内使用`startAsync()`启动异步上下文。然后,你可以通过...

    servlet高级应用过滤器、防盗链等一系列技术工具打包

    在Servlet世界里,过滤器是一种预处理和后处理请求的能力,可以在请求到达目标Servlet之前或之后进行拦截。通过实现javax.servlet.Filter接口并配置在web.xml中,我们可以定义过滤规则,如字符编码转换、日志记录、...

    Servlet过滤器使用

    这是Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器实例后将调用这个方法。在这个方法中可以读取web.xml文件中Servlet过滤器的初始化参数。 b、doFilter(ServletRequest,ServletResponse,FilterChain)...

    Servlet转码过滤器.rar

    如果输入是中文,后台servlet再次输出这个内容时,可能就会是乱码,这是因为serlvet中默认是以ISO-8859-1格式编码的,如果后台有多个Servlet,多个参数,这样就不合适,这个问题,我们可以通过一个过滤器统一解决,使...

    JAVA WEB中的Servlet过滤器

    在Java Web开发中,Servlet过滤器(Filter)是不可或缺的一部分,它允许开发者在请求到达Servlet之前或响应离开Servlet之后对其进行处理。Servlet过滤器是按照指定的配置顺序进行调用的,能够实现数据的预处理、后...

Global site tag (gtag.js) - Google Analytics