看台湾林信良的《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过滤器是Java Web开发中的一个重要组件,它允许开发者在请求到达Servlet之前或者响应离开Servlet之后进行拦截处理。本教程将深入讲解如何配置和使用Servlet过滤器,以及介绍五个经典的过滤器实例。 首先,让...
在标题"Servlet过滤器的简单使用源码+文档"中,我们可以理解为这个压缩包包含了一个关于Servlet过滤器的基础应用示例,以及相关的源代码和文档资料。描述中提到的"实现一个登陆界面",表明了过滤器可能被用作验证...
在这个项目中,“jsp+servlet登录验证过滤器”涉及了用户登录验证的过程,以及使用过滤器(Filter)来实现这一功能。下面将详细介绍这个主题中的相关知识点。 1. **JSP**:JSP是一种服务器端的技术,允许开发者在...
Servlet过滤器是Java Web开发中的一个重要概念,它允许开发者在请求到达目标Servlet之前或之后对请求和响应进行处理。在这个“servlet过滤器做的简单登陆demo”中,我们将探讨如何利用过滤器实现一个基础的登录验证...
Servlet过滤器是Java Web开发中的一个重要概念,它允许开发者在请求到达Servlet之前或者响应离开Servlet之后进行拦截处理。本教程将详细介绍如何在Eclipse环境中创建并实现一个Servlet过滤器。 一、Servlet过滤器...
在这个小型的基于Servlet的过滤器项目中,我们主要关注如何利用过滤器来实现对网站访问用户的计数功能。这个功能在很多网站统计分析中都非常常见,可以帮助我们了解网站的流量情况。 首先,我们要理解Servlet过滤器...
在Java Web开发中,`Servlet`过滤器是一种特殊的功能组件,可以在请求到达目标资源(如Servlet或JSP页面)之前进行预处理,也可以在响应发送到客户端之前进行后处理。它们可以用于实现跨切面的需求,比如统一设置...
在IT领域,特别是Java Web开发中,Servlet过滤器(Filter)是实现用户权限管理、登录状态验证等关键功能的重要机制之一。本文将深入探讨如何利用Servlet过滤器来验证用户是否已登录,以及如何配置过滤器以针对特定的...
### Servlet过滤器解决乱码问题 在Web应用开发过程中,字符编码问题经常出现,尤其是在处理中文等多字节字符时。如果不正确地设置字符编码,可能会导致页面显示乱码。本文将详细介绍如何通过Servlet过滤器来解决这...
这个对象可以用来注册监听器,以便在异步操作完成后接收通知,或者通过`AsyncContext.dispatch()`方法将请求分派到其他资源(如URL、Servlet)。 异步Servlet的生命周期包括以下几个关键步骤: 1. **启动异步**:...
总结一下,Servlet编码过滤器的作用是统一处理请求和响应的编码,防止因为编码不一致导致的乱码问题。实现编码过滤器需要实现`Filter`接口,并在`web.xml`中配置。在实际开发中,我们可以根据需求自定义过滤器的逻辑...
总结来说,"java中servlet文字过滤器"是Java Web开发中的一个重要工具,它提供了对HTTP请求和响应的预处理和后处理能力,尤其在处理编码问题和安全过滤方面起到了关键作用。通过合理配置和实现,Filter可以帮助我们...
Servlet过滤器,作为Java Servlet规范中的一个重要组成部分,自2.3版本起被引入,主要用于在Servlet容器中对请求和响应进行预处理和后处理。它不直接生成请求或响应,而是作为一个中间件存在,能够在请求到达目标...
Servlet过滤器是Java Web开发中的一个重要概念,它允许开发者在请求到达Servlet之前或者Servlet响应返回客户端之前进行拦截处理。在本实例中,我们将深入探讨Servlet过滤器(Filter)的使用和实现,以及它在实际应用...
因此,使用Servlet过滤器(Filter)来处理这类问题成为了一种更加优雅的解决方案。 #### 实例目标 本实例的目标是设计并实现一个简单的Servlet过滤器,用于检查用户的登录状态。具体来说,当用户通过正常的登录...
要实现异步Servlet,你需要在Servlet类上使用`@.WebServlet(asyncSupported = true)`注解来启用异步支持,并在`service()`方法或`doGet()`、`doPost()`等方法内使用`startAsync()`启动异步上下文。然后,你可以通过...
在Servlet世界里,过滤器是一种预处理和后处理请求的能力,可以在请求到达目标Servlet之前或之后进行拦截。通过实现javax.servlet.Filter接口并配置在web.xml中,我们可以定义过滤规则,如字符编码转换、日志记录、...
这是Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器实例后将调用这个方法。在这个方法中可以读取web.xml文件中Servlet过滤器的初始化参数。 b、doFilter(ServletRequest,ServletResponse,FilterChain)...
如果输入是中文,后台servlet再次输出这个内容时,可能就会是乱码,这是因为serlvet中默认是以ISO-8859-1格式编码的,如果后台有多个Servlet,多个参数,这样就不合适,这个问题,我们可以通过一个过滤器统一解决,使...
在Java Web开发中,Servlet过滤器(Filter)是不可或缺的一部分,它允许开发者在请求到达Servlet之前或响应离开Servlet之后对其进行处理。Servlet过滤器是按照指定的配置顺序进行调用的,能够实现数据的预处理、后...