【问题标题】:Jetty Filter to modify the Response - java.lang.IllegalStateException: WRITERJetty Filter 修改响应 - java.lang.IllegalStateException: WRITER
【发布时间】:2012-11-16 17:42:30
【问题描述】:

我正在尝试修改过滤器中的 http 响应并收到以下异常

java.lang.IllegalStateException: WRITER at org.eclipse.jetty.server.Response.getOutputStream(Response.java:657) 在 javax.servlet.ServletResponseWrapper.getOutputStream(ServletResponseWrapper.java:142) 在 org.eclipse.jetty.servlets.ProxyServlet.service(ProxyServlet.java:414) 在 org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:643) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1331) 在 com.cisco.vsx.node.proxy.http.RegexFilter.doFilter(RegexFilter.java:36)

我正在使用 SelectChannelSelector 和 ProxyServlet.Transparent 代理。

下面是测试类的sn-p

ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/");

ProxyServlet.Transparent p1 = new ProxyServlet.Transparent("/proxy",
    "www.cisco.com", 80);
ServletHolder servletHolder = new ServletHolder(p1);
context.addServlet(servletHolder, "/proxy/*"); 
context.addFilter(new FilterHolder(RegexFilter.class), "/*", null);

server.setHandler(context);

server.start();
server.join();

这是过滤器类的代码

PrintWriter out = response.getWriter();
CharResponseWrapper wrapper = new CharResponseWrapper((HttpServletResponse) response);

chain.doFilter(request, wrapper);

String html = wrapper.toString();
if (regex != null && response.getContentType() != null 
        && response.getContentType().startsWith("text/html")) {
    Matcher matcher = regex.matcher(html);
    Map<Integer, Integer> matches = new LinkedHashMap<Integer, Integer>();
    while (matcher.find()) {
        int start = matcher.start(1);
        System.out.println("START" + start);
        int end = matcher.end(1);
        System.out.println("END" + end);
        matches.put(start, end - start);
    }
    StringBuffer sb = new StringBuffer();
    int start = 0;
    for (int startIndex : matches.keySet()) {
        String str = html.substring(start, startIndex) + "/proxy/";
        sb.append(str);
        start = startIndex + matches.get(startIndex);
    }
    html = sb.toString();
}

response.setContentLength(html.getBytes().length);
out.write(html);

不知道哪里出了问题。

【问题讨论】:

    标签: servlets jetty servlet-filters


    【解决方案1】:

    您的 Jetty 响应可以采用两种(技术上是三种)不同的模式。一种是writer模式,一种是streaming模式(第三种基本是未定模式)。

    如果您在“未决定”响应中调用getWriter(),则您将其置于写入器模式,该模式无法逆转。如果稍后尝试在流模式下使用此响应(通过调用 getOutputStream()),则会引发您看到的异常。

    要解决此问题,请不要在编写器模式下使用此响应,而是在 OutputStream 上“做你的事”。如果您稍后(在 doChain 之后)访问作者,您会得到逆异常

    java.lang.IllegalStateException: 流

    改为。

    【讨论】:

      猜你喜欢
      • 2020-10-14
      • 2012-04-17
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-22
      • 2016-04-10
      相关资源
      最近更新 更多